重定向和用户会话
用户输入名字后提交名字后提交表单,然后点击浏览器的刷新按钮,会看到一个莫名其妙的警告,要求再次提交表单之前进行确认。
POST请求放在最后,浏览器会询问用不用把之前的数据在提交一遍了。我们尽量不把POST请求放在最后,使用重定向和用户会话储存之前数据的方式。这个技巧叫做Post/重定向/Get模式。
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'))
程序把数据储存在用户会话中,在请求之间记住数据。用户会话是请求上下文的变量,名叫session,像标准python字典一样操作。
首先,用户输入名字存储在session会话中,然后重定向的意思就是再执行一遍index()函数,第二遍时if直接跳过,name值从session.get(‘name’)得到传入模板。
Flash消息
@app.route('/', methods=['GET', 'POST'])
def index():
form = NameForm()
if form.validate_on_submit():
old_name = session.get('name')
if old_name is not None and old_name != form.name.data:
flash('Looks like you have changed your name!')
session['name'] = form.name.data
return redirect(url_for('index'))
return render_template('index.html',
form = form, name=session.get('name'))
其中判断是否发送flash语句的是:
old_name = session.get('name')
if old_name is not None and old_name != form.name.data:
flash('Looks like you have changed your name!')
把之前的会话储存的name值给old_name,然后判断是否调用flash()函数。
但是仅仅调用flash()函数并不能把消息显示出来做好在基模板中渲染消息。Flask把get_flashed_messages()函数开放给模板,用来获取并渲染消息。
flash消息模板如下:
{% block content %}
<div class = "container">
{% for message in get_flashed_messages() %}
<div class="alert alert-warning">
<button type="button" class="close" datadismiss="alert">×</button>
{{ message }}
</div>
{% endfor %}
</div>
<div class="container">
{% block page_content %}{% endblock %}
</div>
{% endblock %}
他并没有把flash消息放在{% block page_content %}{% endblock %}
之间,而是放在了{% block content %}里面,结构是<div class = "container"></div>
里面是循环语句,在里面是flash消息的div块。
注意:在模板中使用循环是因为在之前的请求循环中每次调用flash()函数时都会生成一个消息,所以可能有多个消息排队等待显示。get_flash_messages()函数获取到的消息在下次调用时不会再次返回,因此Flash消息只显示一次,然后就消失了。