1. 程式人生 > >Flask系列教程(32)——Flask訊號

Flask系列教程(32)——Flask訊號

Flask訊號:

如果想深入學習Flask,可以觀看這套免費Flask教學視訊:零基礎:Flask入門到專案實戰

安裝:

flask中的訊號使用的是一個第三方外掛,叫做blinker。通過pip list看一下,如果沒有安裝,通過以下命令即可安裝blinker

pip install blinker

內建訊號:

flask內建集中常用的訊號:

  1. flask.template_rendered:模版渲染完畢後傳送,示例如下:
from flask import template_rendered
def log_template_renders
(sender,template,context,*args):
print 'sender:',sender print 'template:',template print 'context:',context template_rendered.connect(log_template_renders,app)
  1. flask.request_started:請求開始之前,在到達檢視函式之前傳送,訂閱者可以呼叫request之類的標準全域性代理訪問請求。示例如下:
def log_request_started(sender,**extra):
print 'sender:',sender print 'extra:',extra request_started.connect(log_request_started,app)
  1. flask.request_finished:請求結束時,在響應傳送給客戶端之前傳送,可以傳遞response,示例程式碼如下:
def log_request_finished(sender,response,*args):
    print 'response:',response
request_finished.connect(log_request_finished,app)
  1. flask.got_request_exception:在請求過程中丟擲異常時傳送,異常本身會通過exception傳遞到訂閱的函式。示例程式碼如下:
def log_exception_finished(sender,exception,*args):
    print 'sender:',sender
    print type(exception)
got_request_exception.connect(log_exception_finished,app)
  1. flask.request_tearing_down:請求被銷燬的時候傳送,即使在請求過程中發生異常,也會發送,示例程式碼如下:
def log_request_tearing_down(sender,**kwargs):
    print 'coming...'
request_tearing_down.connect(log_request_tearing_down,app)
  1. flask.appcontext_tearing_down:在應用上下文銷燬的時候傳送,它總是會被呼叫,即使發生異常。示例程式碼如下:
def log_appcontext_tearing_down(sender,**kwargs):
    print 'coming...'
appcontext_tearing_down.connect(log_appcontext_tearing_down,app)

自定義訊號:

自定義訊號分為3步,第一是定義一個訊號,第二是監聽一個訊號,第三是傳送一個訊號。以下將對這三步進行講解:

  1. 定義訊號:定義訊號需要使用到blinker這個包的Namespace類來建立一個名稱空間。比如定義一個在訪問了某個檢視函式的時候的訊號。示例程式碼如下:
from blinker import Namespace

mysignal = Namespace()
visit_signal = mysignal.signal('visit-signal')
  1. 監聽訊號:監聽訊號使用singal物件的connect方法,在這個方法中需要傳遞一個函式,用來接收以後監聽到這個訊號該做的事情。示例程式碼如下:
def visit_func(sender,username):
    print(sender)
    print(username)

mysignal.connect(visit_func)
  1. 傳送訊號:傳送訊號使用singal物件的send方法,這個方法可以傳遞一些其他引數過去。示例程式碼如下:
mysignal.send(username='zhiliao')

如果想深入學習Flask,可以觀看這套免費Flask教學視訊:零基礎:Flask入門到專案實戰