1. 程式人生 > >4.6 閃現訊息

4.6 閃現訊息

請求完成後,有時需要讓使用者知道狀態發生了變化,可以是確認訊息、警告或者錯誤提醒。一個典型例子是,使用者提交有一項錯誤的登入表單後,伺服器發回的響應重新渲染登入表單,並在表單上面顯示一個訊息,提示使用者名稱或密碼無效。

Flask 本身內建這個功能。如示例 4-6 所示,flash() 函式可實現這種效果。

示例 4-6 hello.py:閃現訊息

from flask import Flask, render_template, session, redirect, url_for, 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() 函式, 在發給客戶端的下一個響應中顯示一個訊息。

僅呼叫 flash() 函式並不能把訊息顯示出來,應用的模板必須渲染這些訊息。最好在基模板中渲染閃現訊息,因為這樣所有頁面都能顯示需要顯示的訊息。Flask 把 get_flashed_messages() 函式開放給模板,用於獲取並渲染閃現訊息,如示例 4-7 所示。

示例 4-7 templates/base.html:渲染閃現訊息

{% block content %}
<div class="container">
    {% for message in get_flashed_messages() %}
    <div class="alert alert-warning">
        <button type="button" class="close" data-dismiss="alert">&times;</button> 
        {{ message }}
    </div>
    {% endfor %}

    {% block page_content %}{% endblock %} 
</div>
{% endblock %}

這個示例使用 Bootstrap 提供的 CSS alert 樣式渲染警告訊息(如圖 4-4 所示)。

圖 4-4:閃現訊息

這裡使用了迴圈,因為在之前的請求迴圈中每次呼叫 flash() 函式時都會生成一個訊息, 所以可能有多個訊息在排隊等待顯示。get_flashed_messages() 函式獲取的訊息在下次呼叫時不會再次返回,因此閃現訊息只顯示一次,然後就消失了。

從 Web 表單中獲取使用者輸入的資料是多數應用都需要的功能,把資料儲存在永久儲存器中也是一樣。第 5 章將介紹如何在 Flask 中使用資料庫。

《基於Python的Web應用開發實戰(第二版)》