使⽤Flask-WTF处理表单
扩展Flask-WTF继承了WTFforms,使⽤它可以在flask中更⽅便的使⽤WTForms。Flask-WTF将表单数据解析、CSRF保护、⽂件上传等功能与Flask集成。
先⽤pipenv安装flask-wtf及其依赖:
激活pipenv环境
看下环境中安装了什么
pipenv install flask-wtf,安装flask-wtf
装完了后:
flask-wtf默认为每个表单启⽤CSRF保护,它为我们⾃动⽣成和验证CSRF令牌。默认情况下,fflask-wtf使⽤程序秘钥来对CSRF令牌进⾏签名(token),所以我们需要为程序设置秘钥:
app.secret_key = ‘secret string’
定义WTForms表单来
使⽤WTForms创建表单时,表单由python类表⽰,这个类继承从STForms导⼊的Form类。⼀个表单由若⼲个输⼊字段组成,这些字段分别⽤表单类的类属性来表⽰(字段即field,可以简单理解为表单内的输⼊框、按钮等部件),下⾯定义了⼀个LoginForm类,最终会⽣成像之前定义的HTML表单:
from wtforms import Form, StringField, PasswordField, BooleanField, SubmitFieldfrom wfforms.validators import DataRequired, Lengthclass LoginForm(Form):
username = StringField('Username', validators=[DataRequired()])
password = PasswordField('Password', validators=[DataRequired(), Length(8,128)]) remember = BooleanField('Remember me') submit = SubmitField('Log in')
每个字段属性通过实例化WTForms提供的字段类来表⽰。字段属性的名称将作为对应HTML元素的name属性及id属性值。字段属性名称⼤⼩写敏感,不能以下划线或validate开头。
这⾥的LoginForm表单类中定义了四个字段:⽂本字段StringField、密码字段Pawword-Field、勾选框字段BooleanField和提交按钮字段SubmitField。字段类从wtforms包导⼊,有些字段最终⽣成的HTML代码相同,不过WTForms会在表单提交后根据表单类中字段的类型对数据进⾏处理,转换成对应的python类型,以便在python脚本中对数据进⾏处理。
常⽤的WTForms字段如下表:
通过实例化字段类时传⼊的参数,我们可以对字段进⾏设置,字段类构造⽅法接受的常⽤参数如下表:
在WTForms中,验证器(validator)是⼀系列⽤于验证字段数据的类,我们在实例化字段类时使⽤validators关键字来指定附加的验证器列表。验证器从wtforms.validators模块中导⼊,常⽤的验证器,如下表:
在实例化验证类时,message参数⽤来传⼊⾃定义错误消息,如果有设置则使⽤内置的英⽂错误消息
validators参数接收⼀个可调⽤对象组成的列表。内置的验证器通过实现了__call__()⽅法的类表⽰,所以我们需要在验证器后添加括号。
在name和password字段⾥,我们都是⽤了DataRequired验证器,⽤来验证输⼊的数据是否有效。另外,password字段⾥还添加了⼀个Length验证器,⽤来验证输⼊的数据长度是否在给定的范围内。验证器的第⼀个参数⼀般为错误提⽰消息,我们可以使⽤message关键字传递参数,通过传⼊⾃定义错误信息来覆盖内置消息,⽐如:
name = StringField(‘Your Name’, validators=[DataRequired(message=u’名字不能为空’)])
当使⽤Flask-WTF定义表单时,我们仍然使⽤WTForms提供的字段类和验证器,创建的⽅式也完全相同,只不过表单类要继承Flask-WTF提供的FlaskForm类。FlaskForm类继承⾃Form类,进⾏了⼀些设置,并附加了写辅助⽅法,以便与Flask集成。我们创建⼀个forms.py⽂件(form/forms.py),⽤来存储各种表单类。下⾯例⼦是继承FlaskForm类的LoginForm表单:
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, SubmitFieldfrom wtforms.validators import DataRequired, Length
class LoginForm(FlaskForm):
username = StringField('Username', validators=[DataRequired()])
password = PasswordField('Password', validators=[DataRequired(), Length(8, 128)]) remember = BooleanField('Remember me') submit = SubmitField('Log in')
配置键WTF_CSRF_ENABLED⽤来设置是否开启CSRF保护,默认为True。Flask-WTF会⾃动在实例化表单时添加⼀个包含CSRF令牌值的隐藏字段,字段名为csrf_token。
输出HTML代码
以我们使⽤WTForms创建的LoginForm为例,实例化表单类,然后将实例属性转换成字符串或直接调⽤就可以获取表单字段对应的HTML代码(需要在虚拟环境激活上下⽂):>>> form = LoginForm()>>> form.username()
u''>>> form.submit()
u''>>> form.password()
u''>>> form.remember()
u''
字段的
Copyright © 2019- yrrf.cn 版权所有 赣ICP备2024042794号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务