Flask--信號 blinker
Flask框架中的信號基於blinker,能夠讓開發者在flask請求過程當中 定製一些用戶行爲執行。 在請求先後,模板渲染先後,上下文先後,異常 的時候
安裝:css
pip install blinker
1 Flask的內置信號:html
內部經過 send方法 觸發信號 2 request_started = _signals.signal('request-started') # 請求到來前執行 5 request_finished = _signals.signal('request-finished') # 請求結束後執行 3 before_render_template = _signals.signal('before-render-template') # 模板渲染前執行 4 template_rendered = _signals.signal('template-rendered') # 模板渲染後執行 0 got_request_exception = _signals.signal('got-request-exception') # 請求執行出現異常時執行 6 request_tearing_down = _signals.signal('request-tearing-down') # 請求執行完畢後自動執行(不管成功與否) 7 appcontext_tearing_down = _signals.signal('appcontext-tearing-down') # 請求上下文執行完畢後自動執行(不管成功與否) 1 appcontext_pushed = _signals.signal('appcontext-pushed') # 請求上下文push時執行,通常用不到 8 appcontext_popped = _signals.signal('appcontext-popped') # 請求上下文pop時執行 message_flashed = _signals.signal('message-flashed') # flash消息的時候-- 調用flask在其中添加數據時,自動觸發
補充:Django的信號python
Model signals # ORM 操做的時候觸發 pre_init # django的modal執行其構造方法前,自動觸發 post_init # django的modal執行其構造方法後,自動觸發 pre_save # django的modal對象保存前,自動觸發 post_save # django的modal對象保存後,自動觸發 pre_delete # django的modal對象刪除前,自動觸發 post_delete # django的modal對象刪除後,自動觸發 m2m_changed # django的modal中使用m2m字段操做第三張表(add,remove,clear)先後,自動觸發 class_prepared # 程序啓動時,檢測已註冊的app中modal類,對於每個類,自動觸發 Management signals pre_migrate # 執行migrate命令前,自動觸發 post_migrate # 執行migrate命令後,自動觸發 Request/response signals request_started # 請求到來前,自動觸發 request_finished # 請求結束後,自動觸發 got_request_exception # 請求異常後,自動觸發 Test signals setting_changed # 使用test測試修改配置文件時,自動觸發 template_rendered # 使用test測試渲染模板時,自動觸發 Database Wrappers connection_created # 建立數據庫鏈接時,自動觸發
使用:nginx
from django.core.signals import request_finished from django.core.signals import request_started from django.core.signals import got_request_exception from django.db.models.signals import class_prepared from django.db.models.signals import pre_init, post_init from django.db.models.signals import pre_save, post_save from django.db.models.signals import pre_delete, post_delete from django.db.models.signals import m2m_changed from django.db.models.signals import pre_migrate, post_migrate from django.test.signals import setting_changed from django.test.signals import template_rendered from django.db.backends.signals import connection_created def callback(sender, **kwargs): print("xxoo_callback") print(sender,kwargs) 信號.connect(callback)
自定義信號數據庫
a. 定義信號
import django.dispatch pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"]) b. 註冊信號 def callback(sender, **kwargs): print("callback") print(sender,kwargs) pizza_done.connect(callback) c. 觸發信號 from 路徑 import pizza_done pizza_done.send(sender='seven',toppings=123, size=456)
2 特殊裝飾器 與 信號的區別django
信號的功能 均可以 經過擴展實現 區別: 1 返回值:註冊到信號的函數,沒有返回值, 只執行自定義操做 2 自定義信號,能夠下降代碼的耦合
3 自定義信號的實現:( 發送消息 )flask
def QQ(*args,**kwargs): pass def WX(*args,**kwargs): pass from flask.signals import _signals MSG = _signals.signal('MSG') # 建立信號 MSG.connect(QQ) # 註冊 MSG.connect(WX) @app.route('/',methods=['GET','POST'],endpoint='index') def index(): MSG.send(sender='xxx',a=1,b=2) # 觸發 return render_template('login.html') if __name__ == '__main__': app.run()
使用例子:ruby
關於請求進來 >>.先執行 擴展的裝飾器 before_first_request >> 而後request_start信號 >> 而後 before_request , 而後視圖 @app.before_first_request def sayhello(): print('hello11') def test(*args,**kwargs): print('test22') from flask.signals import request_started request_started.connect(test) @app.route('/',methods=['GET','POST'],endpoint='index') def index(): return 'hello333' if __name__ == '__main__': app.run()