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

4.6 閃現消息

狀態 提示 form 請求 ndb 一次 如何 methods bubuko

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

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應用開發實戰(第二版)》

4.6 閃現消息