第二章介绍的request对象,使用了客户端请求的所有信息。特别地,request.form提供了对POST请求提交的表单数据的访问。尽管Flask请求对象的支持足于处理网页单,但是还有很多作务很繁锁和重复。两个很好的例子是产生HTML表单代码和验证表单数据。
Flask-WTF扩展处理表单的体验更让人愉快。这个扩展是WTForms的 Flask集成。Flask-WTF和它的依赖可以通过pip安装:
(venv) $ pip install flask-wtf
Cross-Site Request Forgery (CSRF) 保护
黙认情况下, Flask-WTF保护所有的表单免受Cross-Site Request Forgery (CSRF)攻击。当恶意网站发送请求到攻击者登入的不同的网站时会出现CSRF攻击。
要实施 CSRF保护,Flask-WTF要求应用配置密钥。Flask-WTF用这个密钥产生加密标签来证实表单数据请求是授权的。
Example 4-1展示如何配置密钥
Example 4-1. hello.py: Flask-WTF configuration
app = Flask(__name__)
app.config['SECRET_KEY'] = 'hard to guess string'
app.config字典是框架、扩展或应用本身存贮配置信息的通用地方。配置值可以通过标准的字典符号添加到app.config。configuration对象也有函数从环境或文件中导入配置值。
SECRET_KEY配置变量被Flask和其它扩展用作通用密钥。如它的名字所示,加密的强度取决于变量的值。在不同的应用中使用不同的密钥并确保这个字符串不被别人知道。为了增强安全性,密钥应贮存于环境变量中而不是被嵌入到代码中。这个技术描述于第7章。
Form类
Flask-WTF时,每一个网页表单由一个类来呈现它继承自Form类。这个类定义了表单中字段的列表,每个字段呈现为一个对象。每个字段对象可以附着一个或多个验证器。验证器是检查用户输入的函数。
Example 4-2 展示一个简单的表单,它有一个文本字段和一个提交字段。
Example 4-2. hello.py: 表单类定义
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')
表单中的字段以类的变量定义,每个类的变量赋一个相关的对象具有一个类型。前面的例子里,NameForm表单有一个文本字段称为name以及一个提交按钮。StringField类呈现为元素具有type="text"的属性。SubmitField类呈现元素具有 type="submit"属性。field构造函数的第一个参数是宣染表单时的label。
StringField 构造器中包含的可选的验证器参数定义了检查器的列表,它们在接受前作用于用户提交的数据。Required()验证器确保提效的字段非空。表单的基类被Flask-WTF 扩展定义,所以它导入自flask_wtf。但是字段和验证器自接从WTForms包导入。
WTForms支持的标准的HTML字段列表见Table 4-1.见:
http://www.aluoyun.cn/details.php?article_id=1