重定向和用户会话
1.从Flask模块中导入session,redirect,url_for
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'))
在程序的前一个版本中,局部变量 name 被用于存储用户在表单中输入的名字。这个变量现,在保存在用户会话中,即 session['name'],所以在两次请求之间也能记住输入的值。
用户输入名字后提交表单,然后点击浏览器的刷新按钮,会看到一个莫名其妙的警告,要求在再次提交表单之前进行确认。之所以出现这种情况,是因为刷新页面时浏览器会重新发送之前已经发送过的最后一个请求。
如果这个请求是一个包含表单数据的 POST 请求,刷新页面后会再次提交表单。大多数情况下,这并不是理想的处理方式
重定向作为 POST 请求的响应,而不是使用常规响应。重定向是一种特殊的响应,响应内容是 URL,而不是包含 HTML 代码的字符串。
浏览器收到这种响应时,会向重定向的 URL 发起 GET 请求,显示页面的内容。
这个页面的加载可能要多花几微秒,因为要先把第二个请求发给服务器。
除此之外,用户不会察觉到有什么不同。现在,最后一个请求是 GET 请求,所以刷新命令能像预期的那样正常使用了。
这个技巧称为 Post/ 重定向 /Get 模式。程序可以把数据存储在用户会话中,在请求之间“记住”数据。用户会话是一种私有存储,存在于每个连接到服务器的客户端中。