欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

WTForms表单验证的基本使用

程序员文章站 2023-12-21 16:33:52
...

Flask中WTForms的表单验证使用

'''
WTForms的基本使用步骤:
1. 自定义表单类,并继承wtforms.Form类。
2. 定义好需验证的字段,字段名应与input标签的name名一致。
3. 在字段上指定具体的数值类型(如StringField,IntegerField等)。
4. 在相关字段上指定验证器。
5. 将request.form作为参数通过vaildate()方法验证,返回布尔类型。
'''
import ...

'''
WTForms常用的验证方法:
1. Email(): 验证是否符合email格式。
2. InputRequired(): 要求不为空。
3. NumberRange(start, end): 数值范围。
4. Regexp(pattern): 正则表达式。
5. URL(): url地址形式。
6. UUID(): uuid。
7. Length(num1, num2): 用于指定字符长度范围。
8. EqualTo('input.name'): 与另一个input标签的value值进行比较
通过email=StringField([Length(7,15,message='...'), ...], validators=[Email('..'), ...]使用
'''
# 以常见的用户注册表单为例:
# 即input.name包含['uname', 'pwd', 're_pwd', 'email', 'phonenum', 'code'(验证码)]

class MyForm(Form):
    # 设置每个input.name标签的验证方法以及错误信息(message参数)的内容
    uname = StringField(validators=[InputRequired(message='不为空'), Length(6,10)])
    pwd = StringField(validators=[InputRequired('不为空'), Length(6,12, '长度必须在6到12')])
    re_pwd = StringField(validators=[InputRequired(), EqualTo('pwd', '俩次密码输入不一致')])
    email = StringField(validators=[Email('email格式不对')])
    # flags=0可不加默认为0, 底层为re.IGNORECASE
    # flags表示是否忽略匹配对象不为str
    phonenum = StringField(validators=[Regexp('^1[35789]\d{9}$', flags=0, message='电话格式不符')])
    code = StringField(validators=[InputRequired()])

    # 自定义验证方法:
    def validate_code(self, field):     # field为input.name标签的value值
        # field.data可将对应的value值取出,这里是'code'标签。
        if field.data != session.get('code', ''):
            raise ValidationError('验证码不正确')     # 底层是ValueError(Exception)类



class MyView(views.MethodView):
    def __jump(self, error='', **kwargs):
        return render_template('register.html', error=error, **kwargs)

    def get(self):
        # g.code = random.randint(1000, 9999)
        # session['code'] = str(g.code)
        get_code()      # 将g.code保存在session防止用户打开新标签时code不刷新
        return self.__jump(gcode=g.code)

    def post(self):
        myform = MyForm(request.form)   # request.form将value值传递给MyForm中的field
        if myform.validate():
            return '注册成功'
        else:
            get_code()
            # myform.errors为{'uname':['用户不为空'], ...}形式的字典
            return self.__jump(gcode=g.code, **(myform.errors))

version1.add_url_rule('/wtf/', view_func=MyView.as_view('wtf'))

wtforms除了表单验证还有渲染模版的功能,但是比较鸡肋。

相关标签: wtforms flask

上一篇:

下一篇: