做用:Flask框架中的信號基於blinker,其主要就是讓開發者能夠在flask請求過程當中定製一些用戶行爲python
安裝:pip install blinkerflask
內置信號:session
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在其中添加數據時,自動觸發
使用內置信號:app
from flask import Flask,signals app = Flask(__name__) # 往信號中註冊函數,函數名任意 def fun(*args,**kwargs): print('觸發信號',args,kwargs) signals.request_started.connect(fun) @app.route('/') def index(): print('我是請求') return 'ok' if __name__ == '__main__': app.run() # 在內部源碼中,執行了 request_started.send(self)表示發送信號
一個流程中的信號觸發點(瞭解)框架
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) @app.route("/x") def index(): # 觸發信號,這裏的第一個參數是發送者,第二個參數可選的話,必須是關鍵字參數 xxxxx.send('123123', k1='v1') return 'Index' if __name__ == '__main__': app.run()