• Flask09--闪现 , g对象,信号


    1 闪现

    Flask 提供了一个非常简单的方法来使用闪现系统向用户反馈信息。闪现系统使得在一个请求结束的时候记录一个信息,然后在且仅仅在下一个请求中访问这个数据,强调flask闪现是基于flask内置的session的,利用浏览器的session缓存闪现信息。所以必须设置secret_key

    1.1.1 简单的在模板中实现获取闪现信息

    设置闪现内容:flash('恭喜您登录成功')
    模板取出闪现内容:{% with messages = get_flashed_messages() %}  取出的值是列表 可以进一步循环 {% for message in messages%}
    			<p>message</p>
          {% endfor%}
    

    1.1.2 模板中的分类闪现

    当闪现一个消息时,是可以提供一个分类的。未指定分类时默认的分类为 'message' 。 可以使用分类来提供给用户更好的反馈,可以给用户更精准的提示信息体验。

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

    flash('恭喜您登录成功',"status")
    flash('您的账户名为admin',"username")
    

    在使用get_flashed_messages()时候需要传入with_categories=true便可以渲染出来类别

    模板中的分类闪现小结:

    分类设置闪现内容:flash('恭喜您登录成功',"status")
    		    flash('您的账户名为admin',"username")
    模板取值:   {% with messages = get_flashed_messages(with_categories=true) %}
                {% if messages %}
                <ul class=flashes>
                {% for category, message in messages %}
                ...
        
    

    1.1.3 模板中过滤闪现消息

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

    Copyflash('恭喜您登录成功',"status")
    flash('您的账户名为admin',"username")
    

    在使用get_flashed_messages()时候需要传入category_filter=["username"]便可根据类别取出闪现信息。中括号内可以传入的值就是类别,可以传入多个。

    分类设置闪现内容:flash('恭喜您登录成功',"status")
    		    flash('您的账户名为admin',"username")
    模板取值:{% with messages = get_flashed_messages(category_filter=["username"])%}
                {% if messages %}
                  <ul>
                    {%- for message in messages %}
                				...
    

    1.2 在视图中获取闪现信息

    -设置: flash('xxx')
    -取值:get_flashed_message() # 注意这个不同于模板取值,这个是从flask中导入的
    -注意:在视图中获取闪现信息不必非得是两次连续的请求,只要保证是第一次取相应的闪现信息,就可以取得到。
    

    1.2.1 在视图中实现分类获取闪现信息。

    -设置:flash('用户名错误', "username_error")
          flash('用户密码错误', "password_error") # 第二个参数为闪现信息的分类。
    
    -取所有闪现信息的类别和闪现内容:get_flashed_messages(with_categories=True)
        
    -针对分类过滤取值:get_flashed_messages(category_filter=['username_error']) 
    			      # 中括号内可以写多个分类。
        
    -注意:如果flash()没有传入第二个参数进行分类,默认分类是 'message'
      
    

    2.全局 g 对象

    from flask import g
    
    放 g.name = 'lqw'
    取  res = g.name
    
    注意:
    	专门用来存储用户信息的g对象,g的全称的为global
    	g对象在一次请求中的所有的代码的地方,都是可以使用的
    

    2.1 g和session的区别

      session对象是可以跨request的,只要session还未失效,不同的request的请求会获取到同一个session,但是g对象不是,g对象不需要管过期时间,请求一次就g对象就改变了一次,或者重新赋值了一次
    

    3.信号

    Flask框架中的信号基于blinker,其主要就是让开发者可是在flask请求过程中定制一些用户行为

    安装:pip3 install blinker

    内置信号:

    request_started = _signals.signal('request-started')        # 请求到来前执行
    request_finished = _signals.signal('request-finished')      # 请求结束后执行
    before_render_template = _signals.signal('before-render-template')# 模板渲染前执行
    template_rendered = _signals.signal('template-rendered')       # 模板渲染后执行
    got_request_exception = _signals.signal('got-request-exception')#请求执行出现异常执
    request_tearing_down = _signals.signal('request-tearing-down') # 请求执行完毕后自动执行(无论成功与否)
    appcontext_tearing_down = _signals.signal('appcontext-tearing-down')# 应用上下文执行完毕后自动执行(无论成功与否)
    appcontext_pushed = _signals.signal('appcontext-pushed') # 应用上下文push时执行
    appcontext_popped = _signals.signal('appcontext-popped') # 应用上下文pop时执行
    message_flashed = _signals.signal('message-flashed') # 调用flask在其中添加数据时,自动触发
    

    使用信号:

    from flask import Flask,signals,render_template
    app = Flask(__name__)
    # 往信号中注册函数
    def func(*args,**kwargs):
        print('触发型号',args,kwargs)
    signals.request_started.connect(func)
    # 触发信号:signals.request_started.send()
    @app.before_first_request
    def before_first1(*args,**kwargs):
        pass
    @app.before_first_request
    def before_first2(*args,**kwargs):
        pass
    
    @app.before_request
    def before_first3(*args,**kwargs):
        pass
    
    @app.route('/',methods=['GET',"POST"])
    def index():
        print('视图')
        return render_template('index.html')
    
    
    if __name__ == '__main__':
        app.wsgi_app
        app.run()
    

    一个流程中的信号触发点(了解)

    a. before_first_request
    b. 触发 request_started 信号
    c. before_request
    d. 模板渲染
    	渲染前的信号 before_render_template.send(app, template=template, context=context)
    		rv = template.render(context) # 模板渲染
    	渲染后的信号 template_rendered.send(app, template=template, context=context)
    e. after_request
    f. session.save_session()
    g. 触发 request_finished信号		
    	如果上述过程出错:
    		触发错误处理信号 got_request_exception.send(self, exception=e)
    			
    h. 触发信号 request_tearing_down
    

    自定义信号(了解):

    from flask import Flask, current_app, flash, render_template
    from flask.signals import _signals
    app = Flask(import_name=__name__)
    
    # 自定义信号
    xxxxx = _signals.signal('xxxxx')
     
    def func(sender, *args, **kwargs):
        print(sender)
    # 自定义信号中注册函数
    xxxxx.connect(func)
    注意:
        信号是同步的,自定义信号感觉没啥用,为何不直接使用函数呢???django的信号也是同步的
    
    永远不要高估自己
  • 相关阅读:
    密码保护
    实现搜索功能
    完成个人中心—导航标签
    个人中心标签页导航
    评论列表显示及排序,个人中心显示
    完成评论功能
    从首页问答标题到问答详情页
    首页列表显示全部问答,完成问答详情页布局
    Android基础学习:Android环境搭建
    liunx 硬盘分区
  • 原文地址:https://www.cnblogs.com/liqiangwei/p/14407839.html
Copyright © 2020-2023  润新知