引言
请求对象包含客户端发出的所有请求信息。其中,request.form 能获取POST 请求中提交的表单数据。尽管Flask 的请求对象提供的信息足够用于处理Web 表单,但有些任务很单调,而且要重复操作。比如,生成表单的HTML 代码和验证提交的表单数据。
Flask-WTF(http://pythonhosted.org/Flask-WTF/)扩展可以把处理Web 表单的过程变成一种愉悦的体验。这个扩展对独立的WTForms(http://wtforms.simplecodes.com)包进行了包装,方便集成到Flask 程序中。Flask-WTF 及其依赖可使用pip 安装:
(venv) $ pip install flask-wtf
1.跨站请求伪造保护
默认情况下,Flask-WTF 能保护所有表单免受跨站请求伪造(Cross-Site Request Forgery,CSRF)的攻击。恶意网站把请求发送到被攻击者已登录的其他网站时就会引发CSRF 攻击。为了实现CSRF 保护,Flask-WTF 需要:
- 程序设置一个密钥。
- Flask-WTF 使用这个密钥生成加密令牌。
- Flask-WTF再用令牌验证请求中表单数据的真伪。
设置密钥的方法如示例:
app = Flask(__name__)
app.config['SECRET_KEY'] = 'hard to guess string'
app.config
字典可用来存储框架、扩展和程序本身的配置变量。使用标准的字典句法就能把配置值添加到app.config
对象中。这个对象还提供了一些方法,可以从文件或环境中导入配置值。
SECRET_KEY
配置变量是通用密钥,可在Flask 和多个第三方扩展中使用。如其名所示,加密的强度取决于变量值的机密程度。不同的程序要使用不同的密钥,而且要保证其他人不知道你所用的字符串。(为了增强安全性,密钥不应该直接写入代码,而要保存在环境变量中。)
2.表单类
使用Flask-WTF 时,每个Web 表单都由一个继承自Form
的类表示。这个类定义表单中的一组字段,每个字段都用对象表示。字段对象可附属一个或多个验证函数。验证函数用来验证用户提交的输入值是否符合要求。下面的示例是一个简单的Web 表单,包含一个文本字段和一个提交按钮:
from flask.ext.wtf import Form
from wtforms import StringField, SubmitField
from wtforms.validators import Required
class NameForm(Form):
name = StringField('What is your name?', validators=[Required()])
submit = SubmitField('Submit')
Form 基类由Flask-WTF 扩展定义,所以从flask.ext.wtf 中导入。字段和验证函数却可以直接从WTForms 包中导入。
这个表单中的字段都定义为类变量,类变量的值是相应字段类型的对象。在这个示例中,NameForm
表单中有一个名为name
的文本字段和一个名为submit
的提交按钮。StringField
类表示属性为type=“text” 的<input> 元素。SubmitField
类表示属性为type=“submit” 的<input> 元素。字段构造函数的第一个参数
是把表单渲染成HTML 时使用的标号。
StringField
构造函数中的可选参数validators
指定一个由验证函数组成的列表,在接受用户提交的数据之前验证数据。验证函数Required()
确保提交的字段不为空。
WTForms 支持的HTML 标准字段如表所示:
WTForms 内建的验证函数如表所示:
3.把表单渲染成HTML
表单字段是可调用的,在模板中调用后会渲染成HTML。假设视图函数把一个NameForm
实例通过参数form
传入模板,在模板中可以生成一个简单的表单,如下所示: