Flask 提供了一個很是簡單的方法來使用閃現系統向用戶反饋信息。閃現系統使得在一個請求結束的時候記錄一個信息,而後在且僅僅在下一個請求中訪問這個數據
,強調flask閃現是基於flask
內置的session
的,利用瀏覽器的session
緩存閃現信息。因此必須設置secret_key
。html
設置閃現內容:flash('恭喜您登陸成功') 模板取出閃現內容:{% with messages = get_flashed_messages() %} 取出的值是列表 能夠進一步循環 {% for message in messages%} <p>message</p> {% endfor%}
當閃現一個消息時,是能夠提供一個分類的。未指定分類時默認的分類爲 'message'
。 可使用分類來提供給用戶更好的反饋,能夠給用戶更精準的提示信息體驗。python
要使用一個自定義的分類,只要使用 flash()
函數的第二個參數:django
flash('恭喜您登陸成功',"status") flash('您的帳戶名爲admin',"username")
在使用get_flashed_messages()
時候須要傳入with_categories=true
即可以渲染出來類別flask
模板中的分類閃現小結:瀏覽器
分類設置閃現內容:flash('恭喜您登陸成功',"status") flash('您的帳戶名爲admin',"username") 模板取值: {% with messages = get_flashed_messages(with_categories=true) %} {% if messages %} <ul class=flashes> {% for category, message in messages %} ...
一樣要使用一個自定義的分類,只要使用 flash()
函數的第二個參數:緩存
Copyflash('恭喜您登陸成功',"status") flash('您的帳戶名爲admin',"username")
在使用get_flashed_messages()
時候須要傳入category_filter=["username"]
即可根據類別取出閃現信息。中括號內能夠傳入的值就是類別,能夠傳入多個。session
分類設置閃現內容:flash('恭喜您登陸成功',"status") flash('您的帳戶名爲admin',"username") 模板取值:{% with messages = get_flashed_messages(category_filter=["username"])%} {% if messages %} <ul> {%- for message in messages %} ...
-設置: flash('xxx') -取值:get_flashed_message() # 注意這個不一樣於模板取值,這個是從flask中導入的 -注意:在視圖中獲取閃現信息沒必要非得是兩次連續的請求,只要保證是第一次取相應的閃現信息,就能夠取獲得。
1.2.1 在視圖中實現分類獲取閃現信息。app
-設置:flash('用戶名錯誤', "username_error") flash('用戶密碼錯誤', "password_error") # 第二個參數爲閃現信息的分類。 -取全部閃現信息的類別和閃現內容:get_flashed_messages(with_categories=True) -針對分類過濾取值:get_flashed_messages(category_filter=['username_error']) # 中括號內能夠寫多個分類。 -注意:若是flash()沒有傳入第二個參數進行分類,默認分類是 'message'
from flask import g 放 g.name = 'lqw' 取 res = g.name 注意: 專門用來存儲用戶信息的g對象,g的全稱的爲global g對象在一次請求中的全部的代碼的地方,都是可使用的
session對象是能夠跨request的,只要session還未失效,不一樣的request的請求會獲取到同一個session,可是g對象不是,g對象不須要管過時時間,請求一次就g對象就改變了一次,或者從新賦值了一次
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的信號也是同步的