Flask快速入門(18) — 信號

Flask快速入門(18) — 信號

做用: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()
相關文章
相關標籤/搜索