您好,欢迎来到意榕旅游网。
搜索
您的当前位置:首页flask使用Flask-WTF处理表单--

flask使用Flask-WTF处理表单--

来源:意榕旅游网
flask使⽤Flask-WTF处理表单--

使⽤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''

字段的

>>> form.username.label()

u''>>> form.submit.label()

u''

在虚拟环境下,需要激活程序上下⽂(app_context)和请求上下⽂(request_context),才能实例化运⾏上⾯的程序,激活上下⽂可以通过以下⽅式:

1、 pipenv shell 激活虚拟环境

2、到appForm.py所在⽬录:D:\\flask\\FLASK_PRACTICE3、运⾏python进⼊python命令⾏模式4、激活程序上下⽂:>>> from appForm import app>>> from flask import current_app>>> app_ctx=app.app_context()>>> app_ctx.push()>>> current_app.name'appForm'

5、激活请求上下⽂:>>> from appForm import app>>> from flask import request

>>> app_re=app.test_request_context('/html')>>> app_re.push()>>> request.method'GET'

6、把LoginForm()类定义运⾏⼀下>>> from flask_wtf import FlaskForm

>>> from wtforms import StringField, PasswordField, BooleanField, SubmitField>>> from 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')

之后就可以实例化这个类,做其他的事情了

添加额外的属性

在创建HTML表单时,我们经常会需要使⽤HTML元素的其他属性来对字段进⾏设置。⽐如class属性设置对应的CSS类为字段添加样式;添加placeholder属性设置占位⽂本。默认情况下WForms输出的字段HTML代码只会包含id和name属性,属性值均为表单类中对应的字段属性名称。如果要添加额外的属性,通常有两种⽅法。

使⽤render_kw属性

⽐如下⾯为username字段使⽤render_kw设置了placeholder HTML属性:username = StringField(‘Username’ render_kw={‘placeholder’: ‘Your Username’})这个字段被调⽤后输出的HTML代码是:

调⽤字段时传⼊

在调⽤字段属性时,通过添加括号使⽤关键字参数的形式也可以传⼊字段额外的HTML属性:>>> form.username()

u''>>> form.username(style='width:200px;',class_='bar')

u''

class是pyhton的保留字,我们使⽤class_来代替class,渲染后的会获得正确的classl属性,在模板中调⽤时则可以直接使⽤class。

通过上⾯的⽅法也可以修改id和name属性,但表单被提交后,WTForms需要通过name属性来获取对应的数据,所以不能修改name属性值。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- yrrf.cn 版权所有 赣ICP备2024042794号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务