# Flask-WTF插件 ## 1. Flask-WTF表单验证 `Flask-WTF`是简化了`WTForms`操作的一个第三方库。`WTForms`表单的两个主要功能是验证用户提交数据的合法性以及渲染模板。当然还包括一些其他的功能:`CSRF保护`,文件上传等。安装`Flask-WTF`默认也会安装`WTForms`,因此使用以下命令来安装`Flask-WTF`: ``` pip install flask-wtf ``` ### 1.1 表单验证: 安装完`Flask-WTF`后。来看下第一个功能,就是用表单来做数据验证,现在有一个`forms.py`文件,然后在里面创建一个`RegistForm`的注册验证表单: ```python class RegistForm(Form): name = StringField(validators=[length(min=4,max=25)]) email = StringField(validators=[email()]) password = StringField(validators=[DataRequired(),length(min=6,max=10),EqualTo('confirm')]) confirm = StringField() ``` 在这个里面指定了需要上传的参数,并且指定了验证器,比如`name`的长度应该在`4-25`之间。`email`必须要满足邮箱的格式。`password`长度必须在`6-10`之间,并且应该和`confirm`相等才能通过验证。 写完表单后,接下来就是`regist.html`文件: ```python
``` 再来看视图函数`regist`: ```python @app.route('/regist/',methods=['POST','GET']) def regist(): form = RegistForm(request.form) if request.method == 'POST' and form.validate(): user = User(name=form.name.data,email=form.email.data,password=form.password.data) db.session.add(user) db.session.commit() return u'注册成功!' return render_template('regist.html') ``` `RegistForm`传递的是`request.form`进去进行初始化,并且判断`form.validate`会返回用户提交的数据是否满足表单的验证。 ### 1.2 渲染模板: `form`还可以渲染模板,让你少写了一丢丢的代码,比如重写以上例子,`RegistForm`表单代码如下: ```python class RegistForm(Form): name = StringField(u'用户名:',validators=[length(min=4,max=25)]) email = StringField(u'邮箱:'validators=[email()]) password = StringField(u'密码:',validators=[DataRequired(),length(min=6,max=10),EqualTo('confirm')]) confirm = StringField(u'确认密码:') ``` 以上增加了第一个位置参数,用来在html文件中,做标签提示作用。 在`app`中的视图函数中,修改为如下: ```python @app.route('/regist/',methods=['POST','GET']) def regist(): form = RegistForm(request.form) if request.method == 'POST' and form.validate(): user = User(name=form.name.data,email=form.email.data,password=form.password.data) db.session.add(user) db.session.commit() return u'注册成功!' return render_template('regist.html',form=form) ``` 以上唯一的不同是在渲染模板的时候传入了`form`表单参数进去,这样在模板中就可以使用表单`form`变量了。 接下来看下`regist.html`文件: ```python ``` ## 2. Flask-WTF常用字段和验证器 ### 2.1 Field常用参数: 在使用`Field`的时候,经常需要传递一些参数进去,以下将对一些常用的参数进行解释: - label(第一个参数):`Field`的label的文本。 - validators:验证器。 - id:`Field`的id属性,默认不写为该属性名。 - default:默认值。 - widget:指定的`html`控件。 ### 2.2 常用Field: - BooleanField:布尔类型的Field,渲染出去是`checkbox`。 - FileField:文件上传Field。 ```python # forms.py from flask_wtf.file import FileField,FileAllowed,FileRequired class UploadForm(FlaskForm): avatar = FileField(u'头像:',validators=[FileRequired(),FileAllowed([])]) # app.py @app.route('/profile/',methods=('POST','GET')) def profile(): form = ProfileForm() if form.validate_on_submit(): filename = secure_filename(form.avatar.data.filename) form.avatar.data.save(os.path.join(app.config['UPLOAD_FOLDER'],filename)) return u'上传成功' return render_template('profile.html',form=form) ``` - FloatField:浮点数类型的Field,但是渲染出去的时候是`text`的input。 - IntegerField:整形的Field。同FloatField。 - RadioField:`radio`类型的`input`。表单例子如下: ```python # form.py class RegistrationForm(FlaskForm): gender = wtforms.RadioField(u'性别:',validators=[DataRequired()]) ``` 模板文件代码如下: ```python