1. 视图函数中的表单操作
methods参数被添加到app.route装饰器中,目的是让Flask注册视图函数为GET和POST请求处理程序到URL映射中。若methods参数未给出,视图函数将只注册为GET请求。
GET和POST提交表单的区别?
@app.route('/', methods=['GET', 'POST'])
def index():
# 局部变量name用于保存从表单中接收到的名字,初始化时变量为None。
name = None
# 视图函数创建一个NameForm实例来表示一个表单。
form = NameForm()
if form.validate_on_submit():
name = form.name.data
form.name.data = ''
return render_template('index.html', form=form, name=name)
2. validate_on_submit理解
- 表单的validate_on_submit()方法会在表单被提交且数据通过了所有验证的时候返回True。其他情况下validate_on_submit()返回False。
- 当用户第一次访问应用程序,服务器会收到一个没有表单数据的GET请求,这个时候validate_on_submit()会返回False。
# 当用户提交表单,服务器会收到一个带有数据的POST请求。validate_on_submit()调用Required()验证程序验证相应的表单域。如果name不为空,验证程序接收它同时validate_on_submit()返回True。
- 当用户第一次访问应用程序,服务器会收到一个没有表单数据的GET请求,这个时候validate_on_submit()会返回False。
3. 重定向和用户session
上述代码的问题1:
- 请求刷新页面的时候浏览器重复了上一次发送的请求。当上一次发送的是一个带有表单数据的POST请求,刷新页面会导致重复的表单提交;
- 注意: 一种不错的方法是永远不将POST请求作为浏览器最后发送的请求。
解决方式:
- 使用redirect响应POST请求来代替常规的响应来实现。重定向是一个特殊类型的响应,使用URL来代替HTML代码字符串。当浏览器收到这个响应,它就会给重定向URL发出一个GET请求,然后显示页面。页面也许需要几毫秒的时间来加载,因为需要发送第二个请求给服务器,除此之外用户不会看到任何不同。现在最后一次请求为GET,所以刷新会像预期的那样。这个方法被称为Post/Redirect/Get模式。
上述代码问题2:
当应用程序处理POST请求,需要访问用户输入并保存在form.name.data中的名字,但是一旦该请求结束表单数据就会丢失。因为POST请求是通过重定向来处理,应用程序需要存储名字,以便重定向后的请求可以得到它并使用它来创建真实的响应。
解决方式:
from flask import Flask, render_template, session, redirect, url_for
@app.route('/', methods=['GET', 'POST'])
def index():
form = NameForm()
if form.validate_on_submit():
session['name'] = form.name.data
return redirect(url_for('index'))
return render_template('index.html', form=form, name=session.get('name'))