Flask闪现使用

本文详细介绍如何在Flask应用中使用闪现系统(Flash)进行用户反馈信息的展示,包括基本使用、分类闪现及消息过滤技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Flask 提供了一个非常简单的方法来使用闪现系统(Flash)向用户反馈信息。闪现系统使得在一个请求结束的时候记录一个信息,然后在且仅仅在下一个请求中访问这个数据。这通常配合一个布局模板实现。

我们在这里用一个小 Demo 来说明,这里我们做一个模拟的登陆界面,当密码和用户名匹配时,反馈“你已登录成功”,不匹配时,反馈“登录失败”。

编写 app.py

from flask import (
    Flask, 
    flash,  # 消息闪现
    redirect, 
    render_template, 
    request, url_for
    )

app = Flask(__name__)
app.secret_key = 'some_secret'

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/login', methods=['GET', 'POST'])
def login():
    error = None
    # 以下代码模拟登陆功能
    if request.method == 'POST':
        # 登录失败
        if request.form['username'] != 'admin' or \
                request.form['password'] != '123456':
            error = '登录失败!'
        # 登陆成功
        else:
            # 消息闪现功能,现在可以在 index 页面读取到反馈的信息
            flash('你已成功登录!')
            return redirect(url_for('index'))
    return render_template('login.html', error=error)

if __name__ == "__main__":
    app.run()

编写继承模板 layout.html

<!doctype html>
<!-- 这里是基础模板,等下 login 和 index 都会继承本模板 -->
<title>My Application</title>
<!-- 获取到反馈的消息 -->
{% with messages = get_flashed_messages() %}
    {% if messages %}
        <ul class=flashes>
        {% for message in messages %}
            <li>{{ message }}</li>
        {% endfor %}
        </ul>
    {% endif %}
{% endwith %}

{% block body %}
{% endblock %}

我们让 index.htmllogin.html 继承上面的继承模板。

编写 index.html

<!-- 继承 layout 模板 -->
{% extends "layout.html" %}

<!-- 替换模板做的 block body 部分 -->
{% block body %}
    <h1>Overview</h1>
    <p><a href="{{ url_for('login') }}">登录</a>
{% endblock %}

编写 login.html

<!-- 继承 layout 模板 -->
{% extends "layout.html" %}

<!-- 替换模板做的 block body 部分 -->
{% block body %}

    <h1>Login</h1>
    <!-- 如果有错误信息 -->
    {% if error %}
        <p class=error><strong>Error:</strong> {{ error }}
    {% endif %}

  <form action="" method=post>
    <dl>
        <dt>用户名:<dd>
            <input type=text name=username value="{{request.form.username }}">
        <dt>密码:<dd>
            <input type=password name=password>
    </dl>
        <input type=submit value=Login>
  </form>

{% endblock %}

登陆成功后的界面:

 

 


 

分类闪现

当闪现一个消息时,是可以提供一个分类的。未指定分类时默认的分类为 'message' 。

要使用一个自定义的分类,只要使用 flash() 函数的第二个参数:

flash(u'登录失败!', 'error')

在模板中,您接下来可以调用 get_flashed_messages(with_categories=true) 函数来返回这个分类。

下面来修改一下上例。

编写 app.py

from flask import (
    Flask, 
    flash,  # 消息闪现
    redirect, 
    render_template, 
    request, url_for
    )

app = Flask(__name__)
app.secret_key = 'some_secret'

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/login', methods=['GET', 'POST'])
def login():
    # 以下代码模拟登陆功能
    if request.method == 'POST':
        # 登录失败
        if request.form['username'] != 'admin' or \
                request.form['password'] != '123456':
            # 在闪现的消息中带上分类 'error'
            flash(u'登录失败!', 'error')
        # 登陆成功
        else:
            # 消息闪现功能,现在可以在 index 页面读取到反馈的信息
            flash(u'你已成功登录!')
            return redirect(url_for('index'))
    return render_template('login.html')

if __name__ == "__main__":
    app.run()

编写 layout.html

<!doctype html>
<!-- 这里是基础模板,等下 login 和 index 都会继承本模板 -->
<title>My Application</title>
<!-- 获取到反馈的消息,并带上自定义分类 -->
{% with messages = get_flashed_messages(with_categories=true) %}
    {% if messages %}
        <ul class=flashes>
        {% for category, message in messages %}
            <li class="{{ category }}">{{ message }}</li>
        {% endfor %}
        </ul>
    {% endif %}
{% endwith %}

{% block body %}
{% endblock %}

 


 

过滤闪现消息

我们可以将一个分类的列表传入到 get_flashed_messages() 中, 以过滤函数返回的结果。

过滤器我们这样使用:

get_flashed_messages(with_categories=true, category_filter=["error"])

看一个完整的例子,改写下 layout.html

<!doctype html>
<!-- 这里是基础模板,等下 login 和 index 都会继承本模板 -->
<title>My Application</title>
<!-- 获取到反馈的消息,并带上自定义分类 -->
{% with messages = get_flashed_messages(with_categories=true, category_filter=["message"]) %}
    {% if messages %}
        <ul class=flashes>
        {% for category, message in messages %}
            <li class="messages">{{ message }}</li>
        {% endfor %}
        </ul>
    {% endif %}
{% endwith %}

 <!-- 这里我们加上过滤器,只接受 error 类型的消息  -->
 <!-- 这样做能方便地把不同类型的消息用不同的模板来处理 -->
{% with errors = get_flashed_messages(with_categories=true, category_filter=["error"]) %}
    {% if errors %}
        <div class="alert-message block-message error">
            <a class="close" href="#">×</a>
            <ul>
                {% for msg in errors %}
                    <li>{{ msg }}</li>
                {% endfor %}
            </ul>
        </div>
    {% endif %}
{% endwith %}

{% block body %}
{% endblock %}



作者:SingleDiego
链接:https://www.jianshu.com/p/19a62ae42087
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值