Flask:Flask-WTF扩展

随着表单项的增多,每个表单项的获取都使用 request.form.get 的方式会变的很繁琐,而且表单验证也会增加额外的工作量,可以使用Flask-WTF扩展帮助我们简化很多重复的工作。

Flask-WTF扩展

安装

1
pip install flask-wtf

默认情况下Flask-WTF会保护表单避免跨站请求伪造的攻击,需要配置一个密钥

1
app.config["SECRET_KEY"] = "abc"

注: 密钥必须足够随机否则保护强度会降低

创建表单类

每个表单都必须继承Form

1
2
3
4
5
6
7
8
from flask_wtf import Form
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import Required

class LoginForm(Form):
username = StringField("用户名", validators=[Required()])
password = PasswordField("密码", validators=[Required()])
submit = SubmitField("登录")

常见表单字段类型:

字段类型说明
StringField文本
TextAreaField多行文本
PasswordField密码文本
HiddenField隐藏字段
RadioField单选
FileField文件上传
SelectField下拉框
SelectMultipleField多选下拉
SubmitField提交按钮

常见校验函数:

函数说明
Email邮箱
IPAddressIP地址
URLURL
Length长度
NumberRange数值范围
Regexp正则
Required必填
AnyOf输入值必须是列表中列出的
NoneOf输入值必须不在列表中
Optional无输入值时跳过其他验证
EqualTo比较两个输入框的值

通过模版渲染

在视图函数中生成Form对象并在渲染模版的时候传入

1
2
3
4
5
6
from flask import render_template

@app.route("/")
def index():
form = LoginForm()
return render_template("form.html", form=form)

form.html

1
2
3
4
5
6
7
8
9
10
11
12
<form action="/login" method="post">
{{ form.hiddent_tag() }}
{% for e in form.username.errors %}
{{ e }}
{% endfor %}
{{ form.username.label }}{{ form.username() }}<br/>
{% for e in form.password.errors %}
{{ e }}
{% endfor %}
{{ form.password.label }}{{ form.password() }}<br/>
{{ form.submit() }}<br/>
</form>

注: form.hiddent_tag()会自动加入预防跨站伪造机制,form.XXX.errors封装的是表单错误信息

在渲染的时候可以指定ID,方便JS操作(默认ID为字段名)

1
{{ form.username(id="username") }}<br/>

获取数据

在视图函数中可以通过表单对象属性获取数据

对于GET请求

1
2
3
4
5
6
7
@app.route("/login")
def login():
form = LoginForm(request.args)
username = form.username.data
password = form.password.data
print(username, password)
return "OK"

对于POST请求

1
2
3
4
5
6
7
@app.route("/login", methods=["POST"])
def login():
form = LoginForm(request.form)
username = form.username.data
password = form.password.data
print(username, password)
return "OK"

表单校验

1
2
3
4
5
6
7
8
@app.route("/login", methods=["POST"])
def login():
form = LoginForm()
if form.validate_on_submit():
username = form.username.data
password = form.password.data
print(username, password)
return "OK"

注: form.validate_on_submit()方法会判断请求是否为POST,如果为POST则收集数据并校验,并且表单里必须设置CSRF_TORKEN否则无效

1
{{ form.csrf_token }}

在定义Form类时指定validate(self)方法来进行自定义校验,如果返回True则校验通过(会覆盖默认校验规则)

在定义Form类时指定validate_XXX(self)方法来对字段进行校验,如果校验不通过需要抛出异常:wtforms.ValidationError

自定义校验器

只需要指定一个函数,接收表单对象和字段对象两个参数,对于校验失败的抛出异常

1
2
3
4
5
def int_valid(form, field):
try:
int(field.data)
except:
raise wtforms.ValidationError("必须为数字")

  • 本文作者: Harmel
  • 本文链接: http://www.harmel.cn/2018/08/flask-wtf.html
  • 版权声明: 文章如无特别说明,则表明该文章为原创文章,如需要转载,请注明出处。
  • 本站说明: 本站使用阿里云服务器,如果您喜欢我的网站,欢迎收藏,能捐赠支持一下就再好不过了。