4.4 在视图函数中处理表单
在新版 hello.py 中,视图函数 index() 有两个任务:一是渲染表单,二是接收用户在表单 中填写的数据。
示例 4-4 是更新后的 index() 视图函数。
示例 4-4 hello.py:使用 GET 和 POST 请求方法处理 Web 表单
@app.route('/', methods=['GET', 'POST'])
def index():
name = None
form = NameForm()
if form.validate_on_submit():
name = form.name.data
form.name.data = ''
return render_template('index.html', form=form, name=name)
app.route 装饰器中多出的 methods 参数告诉 Flask,在 URL 映射中把这个视图函数注册为 GET和 POST请求的处理程序。如果没指定 methods参数,则只把视图函数注册为 GET请求的处理程序。
这里有必要把 POST加入方法列表,因为更常使用 POST请求处理表单提交。表单也可以通过 GET请求提交,但是 GET请求没有主体,提交的数据以查询字符串的形式附加到 URL 中,在 浏览器的地址栏中可见。基于这个以及其他多个原因,处理表单提交几乎都使用 POST请求。
局部变量 name 用于存放表单中输入的有效名字,如果没有输入,其值为 None。如上述代 码所示,我们在视图函数中创建了一个 NameForm 实例,用于表示表单。提交表单后,如果 数据能被所有验证函数接受,那么 validate_on_submit() 方法的返回值为 True,否则返回 False。这个函数的返回值决定是重新渲染表单还是处理表单提交的数据。
用户首次访问应用时,服务器会收到一个没有表单数据的 GET 请求,所以 validate_on_ submit() 将返回 False。此时,if 语句的内容将被跳过,对请求的处理只是渲染模板,并 传入表单对象和值为 None 的 name 变量作为参数。用户会看到浏览器中显示了一个表单。
用户提交表单后,服务器会收到一个包含数据的 POST请求。validate_on_submit()会调用名 字字段上依附的 DataRequired() 验证函数。如果名字不为空,就能通过验证,validate_on_ submit()返回 True。现在,用户输入的名字可通过字段的 data属性获取。在 if语句中,把 名字赋值给局部变量 name,然后再把 data属性设为空字符串,清空表单字段。因此,再次 渲染这个表单时,各字段中将没有内容。最后一行调用 render_template() 函数渲染模板,但这一次参数 name的值为表单中输入的名字,因此会显示一个针对该用户的欢迎消息。
图 4-1 是用户首次访问网站时浏览器显示的表单。用户提交名字后,应用会生成一个针对该用户的欢迎消息。欢迎消息下方还是会显示这个表单,以便用户输入新名字。图 4-2 显示了此时应用的样子。

图 4-1:Flask-WTF Web 表单

图 4-2:提交后显示的 Web 表单
如果用户提交表单之前没有输入名字,那么 DataRequired() 验证函数会捕获这个错误,如 图 4-3 所示。注意这个扩展自动提供了多少功能。这说明,像 Flask-WTF 和 Flask-Bootstrap 这样设计良好的扩展能给应用提供十分强大的功能。

图 4-3:验证失败后显示的 Web 表单
《基于Python的Web应用开发实战(第二版)》

浙公网安备 33010602011771号