美文网首页
消息闪现 (Flash)

消息闪现 (Flash)

作者: SingleDiego | 来源:发表于2018-08-06 22:37 被阅读114次

    本文例子的源码:https://github.com/SingleDiego/flask-Flash

    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 %}
    

    相关文章

      网友评论

          本文标题:消息闪现 (Flash)

          本文链接:https://www.haomeiwen.com/subject/akrevftx.html