Web表单(二)

Web表单(二)_第1张图片

重定向和用户会话

用户输入名字后提交名字后提交表单,然后点击浏览器的刷新按钮,会看到一个莫名其妙的警告,要求再次提交表单之前进行确认。
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 %}里面,结构是

里面是循环语句,在里面是flash消息的div块。
注意:在模板中使用循环是因为在之前的请求循环中每次调用flash()函数时都会生成一个消息,所以可能有多个消息排队等待显示。get_flash_messages()函数获取到的消息在下次调用时不会再次返回,因此Flash消息只显示一次,然后就消失了。

你可能感兴趣的:(-----flask)