亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解Python的Flask框架中的signals信號(hào)機(jī)制

 更新時(shí)間:2016年06月13日 16:37:32   作者:digwtx  
這里將為大家來(lái)詳解Python的Flask框架中的signals信號(hào)機(jī)制,包括講述信號(hào)的用途,并給出創(chuàng)建信號(hào)、訂閱信號(hào)、發(fā)送信號(hào)的方法,需要的朋友可以參考下

Flask 提供了信號(hào)(Signals)功能,是一種消息分發(fā)機(jī)制。類(lèi)似于鉤子(Hooks)。使用信號(hào)功能可以降低程序的耦合,分解復(fù)雜的業(yè)務(wù)模型。例如在更新了產(chǎn)品數(shù)據(jù)后,可以發(fā)送一個(gè)信號(hào)。當(dāng)有需要對(duì)產(chǎn)品數(shù)據(jù)進(jìn)行處理的功能時(shí),就可以捕獲信號(hào)進(jìn)行處理。比如要建立產(chǎn)品緩存,或是更新搜索索引等。

定義信號(hào)

Flask 信號(hào)功能使用了 Blinker 模塊,所以需要先安裝 Blinker 模塊

pip install blinker

定義一個(gè)信號(hào):

from blinker import Namespace
product_saved = Namespace()

也可以使用 Flask 包裝的 singles 對(duì)象:

from flask.singles import Namespace

發(fā)送信號(hào)

發(fā)送信號(hào)需要帶上 app 實(shí)例方法,示例如下:

product_saved.send(app, product=product)

app 后面可以添加要傳遞的參數(shù),但必須以 name=value 的格式,不支持使用單個(gè)變量名的方式。

收接信號(hào)

接收信號(hào)可以使用 connect_via 裝飾器函數(shù):

@product_saved.connect_via(app)
def updateCache(app, product):
  print(product)

Flask 中有以下核心信號(hào):

1.flask.template_rendered

這個(gè)信號(hào)發(fā)送于一個(gè)模板被渲染成功后。信號(hào)傳遞的template是模板的實(shí)例,context是環(huán)境對(duì)象是一個(gè)字典。

訂閱示例:

def log_template_renders(sender, template, context, **extra):
  sender.logger.debug('Rendering template "%s" with context %s',
            template.name or 'string template',
            context)
from flask import template_rendered
template_rendered.connect(log_template_renders, app)

2.flask.request_started

這個(gè)信號(hào)發(fā)送于請(qǐng)求開(kāi)始之前,且請(qǐng)求環(huán)境設(shè)置完成之后。因?yàn)檎?qǐng)求環(huán)境已經(jīng)綁定, 所以訂閱者可以用標(biāo)準(zhǔn)的全局代理,如 request 來(lái)操作請(qǐng)求。

訂閱示例:

def log_request(sender, **extra):
  sender.logger.debug('Request context is set up')
from flask import request_started
request_started.connect(log_request, app)
flask.request_finished

這個(gè)信號(hào)發(fā)送于向客戶(hù)端發(fā)送響應(yīng)之前。信號(hào)傳遞的response為將要發(fā)送的響應(yīng)。

訂閱示例:

def log_response(sender, response, **extra):
  sender.logger.debug('Request context is about to close down. '
            'Response: %s', response)
from flask import request_finished
request_finished.connect(log_response, app)
flask.got_request_exception

這個(gè)信號(hào)發(fā)送于請(qǐng)求進(jìn)行中發(fā)生異常的時(shí)候。它的發(fā)送 早于 標(biāo)準(zhǔn)異常處理介于。 在調(diào)試模式下,雖然沒(méi)有異常處理,但發(fā)生異常時(shí)也發(fā)送這個(gè)信號(hào)。信號(hào)傳遞的exception是異常對(duì)象。

訂閱示例:

def log_exception(sender, exception, **extra):
  sender.logger.debug('Got exception during processing: %s', exception)
from flask import got_request_exception
got_request_exception.connect(log_exception, app)
flask.request_tearing_down

這個(gè)信號(hào)發(fā)送于請(qǐng)求崩潰的時(shí)候,不管是否引發(fā)異常。目前,偵聽(tīng)此信號(hào)的函數(shù)在一般 崩潰處理器后調(diào)用,但是沒(méi)有什么東西可用。

訂閱示例:

def close_db_connection(sender, **extra):
  session.close()from flask import appcontext_tearing_down
request_tearing_down.connect(close_db_connection, app)

在 Flask 版本 0.9 中,這還會(huì)傳遞一個(gè)exc關(guān)鍵字參數(shù),如果這個(gè)參數(shù)存在的話(huà)。 這個(gè)參數(shù)是引發(fā)崩潰的異常的引用。

3.flask.appcontext_tearing_down

當(dāng)應(yīng)用環(huán)境崩潰時(shí)發(fā)送這個(gè)信號(hào)。這個(gè)信號(hào)總是會(huì)發(fā)送,甚至是因?yàn)橐粋€(gè)異常引發(fā)的 崩潰。偵聽(tīng)這個(gè)信號(hào)的函數(shù)會(huì)在常規(guī)崩潰處理器后被調(diào)用,但是你無(wú)法回饋這個(gè)信號(hào)。

訂閱示例:

def close_db_connection(sender, **extra):
  session.close()from flask import request_tearing_down
appcontext_tearing_down.connect(close_db_connection, app)

這還會(huì)傳遞一個(gè)exc關(guān)鍵字參數(shù),如果這個(gè)參數(shù)存在的話(huà)。這個(gè)參數(shù)是引發(fā)崩潰的 異常的引用。

4.flask.appcontext_pushed

當(dāng)一個(gè)應(yīng)用的環(huán)境被壓入時(shí),應(yīng)用會(huì)發(fā)送這個(gè)信號(hào)。這個(gè)信號(hào)通常用于在單元測(cè)試中 臨時(shí)鉤接信息。例如可以用于改變g對(duì)象中現(xiàn)存的資源。

用法示例:

from contextlib import contextmanagerfrom
flask import appcontext_pushed
@contextmanagerdef user_set(app, user):
  def handler(sender, **kwargs):
    g.user = user
  with appcontext_pushed.connected_to(handler, app):
    yield

在測(cè)試代碼中這樣寫(xiě):

def test_user_me(self):
  with user_set(app, 'john'):
    c = app.test_client()
    resp = c.get('/users/me')
    assert resp.data == 'username=john'
New in version 0.10.

5.appcontext_popped

當(dāng)一個(gè)應(yīng)用的環(huán)境被彈出時(shí),應(yīng)用會(huì)發(fā)送這個(gè)信號(hào)。這個(gè)信號(hào)通常寫(xiě)成appcontext_tearing_down 信號(hào)。

6.flask.message_flashed

當(dāng)應(yīng)用閃現(xiàn)一個(gè)消息時(shí)會(huì)發(fā)出這個(gè)信號(hào)。message`參數(shù)是消息內(nèi)容, `category參數(shù)是消息類(lèi)別。

訂閱示例:

recorded = []def record(sender, message, category, **extra):
  recorded.append((message, category))
from flask import message_flashed
message_flashed.connect(record, app)

小結(jié)
信號(hào)可以讓你在一瞬間安全地訂閱它們。例如,這些臨時(shí)的訂閱對(duì)測(cè)試很有幫助。使用信號(hào)時(shí),不要讓信號(hào)訂閱者(接收者)發(fā)生異常,因?yàn)楫惓?huì)造成程序中斷。

相關(guān)文章

  • 利用Python裁切tiff圖像且讀取tiff,shp文件的實(shí)例

    利用Python裁切tiff圖像且讀取tiff,shp文件的實(shí)例

    這篇文章主要介紹了利用Python裁切tiff圖像且讀取tiff,shp文件的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-03-03
  • Python如何通過(guò)變量ID得到變量的值

    Python如何通過(guò)變量ID得到變量的值

    這篇文章主要介紹了Python如何通過(guò)變量ID得到變量的值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 如何使用python獲取現(xiàn)在的日期與時(shí)間

    如何使用python獲取現(xiàn)在的日期與時(shí)間

    學(xué)習(xí)了一段時(shí)間的python,不知道大家對(duì)于代碼的編寫(xiě)有了屬于自己的一套思路了呢,下面這篇文章主要給大家介紹了關(guān)于如何使用python獲取現(xiàn)在的日期與時(shí)間的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Python合并兩個(gè)字典的常用方法與效率比較

    Python合并兩個(gè)字典的常用方法與效率比較

    這篇文章主要介紹了Python合并兩個(gè)字典的常用方法與效率比較,實(shí)例分析并對(duì)比了Python合并字典的常用方法,需要的朋友可以參考下
    2015-06-06
  • 用python寫(xiě)一個(gè)windows下的定時(shí)關(guān)機(jī)腳本(推薦)

    用python寫(xiě)一個(gè)windows下的定時(shí)關(guān)機(jī)腳本(推薦)

    由于本人經(jīng)常使用筆記本共享WiFi,但是又不想筆記本開(kāi)機(jī)一夜,每次都是使用dos命令關(guān)機(jī),感覺(jué)好麻煩,然后小編想到用python寫(xiě)一個(gè)定時(shí)關(guān)機(jī)的腳本,具體實(shí)例代碼請(qǐng)參考本文
    2017-03-03
  • Python實(shí)現(xiàn)生成指定大小文件的示例詳解

    Python實(shí)現(xiàn)生成指定大小文件的示例詳解

    這篇文章主要為大家詳細(xì)介紹了Python如何實(shí)現(xiàn)生成指定大小文件,例如txt/圖片/視頻/csv等,文中的示例代碼講解詳細(xì),需要的可以參考下
    2023-08-08
  • 用python爬蟲(chóng)爬取CSDN博主信息

    用python爬蟲(chóng)爬取CSDN博主信息

    這篇文章主要介紹了如何用python爬蟲(chóng)獲取CSDN博主信息的方法,原理和代碼寫(xiě)的非常詳細(xì),對(duì)大家學(xué)習(xí)Python爬取很有用處,有需要的朋友可以和小編一起看一下
    2021-04-04
  • python讀取指定字節(jié)長(zhǎng)度的文本方法

    python讀取指定字節(jié)長(zhǎng)度的文本方法

    今天小編就為大家分享一篇python讀取指定字節(jié)長(zhǎng)度的文本方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • Django+Vue實(shí)現(xiàn)文件上傳下載的項(xiàng)目實(shí)踐

    Django+Vue實(shí)現(xiàn)文件上傳下載的項(xiàng)目實(shí)踐

    本文主要介紹了Django+Vue實(shí)現(xiàn)文件上傳下載的項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • python?import?logging問(wèn)題

    python?import?logging問(wèn)題

    這篇文章主要介紹了python?import?logging問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06

最新評(píng)論