zoukankan      html  css  js  c++  java
  • flask web 表单验证 WTForms

    简介

    WTForms 是一个flask集成框架,或者说是库,用于处理浏览器表单提交的数据,它在flask-WTF的基础上扩展并添加了一些随手可得的精巧帮助函数,这些函数将会是在flask里使用表单更加有趣.

    用法:

    1.field字段

    WTForms支持HTML字段

     
    字段类型 说明
    StringField 文本字段,相当于type类型为text的input标签
    TextAreaField 多行文本字段
    PasswordField 密码文本字段
    HiddenField 隐藏文本字段
    DateField 文本字段, 值为datetime.date格式
    DateTimeField 文本字段, 值为datetime.datetime格式
    IntegerField 文本字段, 值为整数
    DecimalField 文本字段, 值为decimal.Decimal
    FloatField 文本字段, 值为浮点数
    BooleanField 复选框, 值为True 和 False
    RadioField 一组单选框
    SelectField 下拉列表
    SelectMultipleField 下拉列表, 可选择多个值
    FileField 文件上传字段
    SubmitField 表单提交按钮
     FormFiled  把表单作为字段嵌入另一个表单
     FieldList  子组指定类型的字段

     2.Validators验证器

    WTForms可以支持很多表单的验证函数:

    验证函数 说明
    Email 验证电子邮件地址
    EqualTo 比较两个字段的值;常用于要求输入两次秘钥进行确认的情况
    IPAddress 验证IPv4网络地址
    Length 验证输入字符串的长度
    NumberRange 验证输入的值在数字范围内
    Optional 无输入值时跳过其他验证函数
    DateRequired 确保字段中有数据
    Regexp 使用正则表达式验证输入值
    URL 验证URL
    AnyOf 确保输入值在可选值列表中
    NoneOf 确保输入值不在可选列表中

    3.自定义Validators验证器

    第一种:in-line validator(内联验证器)

    也就是自定义一个验证函数,在定义表单类的时候,在对应的字段中加入该函数进行认证.下面的my_length_check函数就是用于判断name字段长度不能超过50

    def my_length_check(form, field):
        if len(field.data) > 50:
            raise ValidationError('Field must be less than 50 characters')
    
    class MyForm(Form):
        name = StringField('Name', [InputRequired(), my_length_check])

    第二种:通用且可重用的验证函数

    一般是以validate开头,加上下划线在加上对应的field字段(validate_field),浏览器在提交表单数据时,会自动识别对应字段所有的验证器,然后执行验证器进行判断.

    class RegistrationForm(FlaskForm):
        email = StringField('Email', validators=[DataRequired(), Length(1, 60), Email()])
        username = StringField('Username', validators=[DataRequired(), Length(1, 60),
            Regexp('^[A-Za-z][A-Za-z0-9_.]*$', 0, 'username must have only letters, numbers dots or underscores')])
        password = PasswordField('Password', validators=[DataRequired(), EqualTo('password2', message='password must match')])
        password2 = PasswordField('Confirm password', validators=[DataRequired()])
    
        def validate_email(self, field):
            if User.objects.filter(email=field.data).count() > 0:
                raise ValidationError('Email already registered')
    
        def validate_username(self, field):
            if User.objects.filter(username=field.data).count() > 0:
                raise ValidationError('Username has exist')

    第三种:比较高级的validators

    class Length(object):
        def __init__(self, min=-1, max=-1, message=None):
            self.min = min
            self.max = max
            if not message:
                message = u'Field must be between %i and %i characters long.' % (min, max)
            self.message = message
    
        def __call__(self, form, field):
            l = field.data and len(field.data) or 0
            if l < self.min or self.max != -1 and l > self.max:
                raise ValidationError(self.message)
    
    length = Length

    4.widget组件

    下面可以以登录界面为实例:

    login.py

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    from flask import Flask, render_template, request, redirect
    from wtforms import Form
    from wtforms import validators
    from wtforms import widgets
    
    class LoginForm(Form):
        name = simple.StringField(
            label='用户名',
            validators=[
                validators.DataRequired(message='用户名不能为空.'),
            ],
            widget=widgets.TextInput(),
            render_kw={'class': 'form-control'}
        )
        pwd = simple.PasswordField(
            label='密码',
            validators=[
                validators.DataRequired(message='密码不能为空.'),
            ],
            widget=widgets.PasswordInput(),
            render_kw={'class': 'form-control'}
        )

    转自:https://www.jianshu.com/p/7e16877757f8

  • 相关阅读:
    java 之 对象与垃圾回收
    Java 之 内部类
    java 接口(interface)
    抽象类
    Java之fianl修饰符
    类的继承
    上传图片
    一般处理程序 给图片添加文字水印
    socket
    初识linq,lambda表达式
  • 原文地址:https://www.cnblogs.com/baijinshuo/p/10269299.html
Copyright © 2011-2022 走看看