中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

Python Web框架Flask信號機制(signals)介紹
來源:易賢網 閱讀:2461 次 日期:2015-01-03 10:35:34
溫馨提示:易賢網小編為您整理了“Python Web框架Flask信號機制(signals)介紹”,方便廣大網友查閱!

信號(signals)

Flask信號(signals, or event hooking)允許特定的發送端通知訂閱者發生了什么(既然知道發生了什么,那我們可以知道接下來該做什么了)。

Flask提供了一些信號(核心信號)且其它的擴展提供更多的信號。信號是用于通知訂閱者,而不應該鼓勵訂閱者修改數據。相關信號請查閱文檔。

信號依賴于Blinker庫。

鉤子(hooks)

Flask鉤子(通常出現在藍圖或應用程序現存的方法中,比如一些內置裝飾器,例如before_request)不需要Blinker庫并且允許你改變請求對象(request)或者響應對象(response)。這些改變了應用程序(或者藍圖)的行為。比如before_request()裝飾器。

信號看起來和鉤子做同樣的事情。然而在工作方式上它們存在不同。譬如核心的before_request()處理程序以特定的順序執行,并且可以在返回響應之前放棄請求。相比之下,所有的信號處理器是無序執行的,并且不修改任何數據。

一般來說,鉤子用于改變行為(比如,身份驗證或錯誤處理),而信號用于記錄事件(比如記錄日志)。

創建信號

因為信號依賴于Blinker庫,請確保已經安裝。

如果你要在自己的應用中使用信號,你可以直接使用Blinker庫。最常見的使用情況是命名一個自定義的Namespace的信號。這也是大多數時候推薦的做法:

代碼如下:

from blinker import Namespace

my_signals = Namespace()

現在你可以像這樣創建新的信號:

代碼如下:

model_saved = my_signals.signal('model-saved')

這里使用唯一的信號名并且簡化調試。可以用name屬性來訪問信號名。

對擴展開發者:

如果你正在編寫一個Flask擴展,你想優雅地減少缺少Blinker安裝的影響,你可以這樣做使用flask.signals.Namespace類。

訂閱信號

你可以使用信號的connect()方法來訂閱信號。第一個參數是信號發出時要調用的函數,第二個參數是可選的,用于確定信號的發送者。一個信號可以擁有多個訂閱者。你可以用disconnect()方法來退訂信號。

對于所有的核心Flask信號,發送者都是發出信號的應用。當你訂閱一個信號,請確保也提供一個發送者,除非你確實想監聽全部應用的信號。這在你開發一個擴展的時候尤其正確。

比如這里有一個用于在單元測試中找出哪個模板被渲染和傳入模板的變量的助手上下文管理器:

代碼如下:

from flask import template_rendered

from contextlib import contextmanager

@contextmanager

def captured_templates(app):

    recorded = []

    def record(sender, template, context, **extra):

        recorded.append((template, context))

    template_rendered.connect(record, app)

    try:

        yield recorded

    finally:

        template_rendered.disconnect(record, app)

現在可以輕松地與測試客戶端配對:

代碼如下:

with captured_templates(app) as templates:

    rv = app.test_client().get('/')

    assert rv.status_code == 200

    assert len(templates) == 1

    template, context = templates[0]

    assert template.name == 'index.html'

    assert len(context['items']) == 10

確保訂閱使用了一個額外的 **extra 參數,這樣當 Flask 對信號引入新參數時你的調用不會失敗。

代碼中,從 with 塊的應用 app 中流出的渲染的所有模板現在會被記錄到templates 變量。無論何時模板被渲染,模板對象的上下文中添加上它。

此外,也有一個方便的助手方法(connected_to()) ,它允許你臨時地用它自己的上下文管理器把函數訂閱到信號。因為上下文管理器的返回值不能按那種方法給定,則需要把列表作為參數傳入:

代碼如下:

from flask import template_rendered

def captured_templates(app, recorded, **extra):

    def record(sender, template, context):

        recorded.append((template, context))

    return template_rendered.connected_to(record, app)

上面的例子看起來像這樣:

代碼如下:

templates = []

with captured_templates(app, templates, **extra):

    ...

    template, context = templates[0]

發送信號

如果你想要發送信號,你可以通過調用 send() 方法來達到目的。它接受一個發件者作為第一個參數和一些可選的被轉發到信號用戶的關鍵字參數:

代碼如下:

class Model(object):

    ...

    def save(self):

        model_saved.send(self)

永遠嘗試選擇一個合適的發送者。如果你有一個發出信號的類,把 self 作為發送者。如果你從一個隨機的函數發出信號,把current_app._get_current_object()作為發送者。

基于信號訂閱的裝飾器

在Blinker 1.1中通過使用新的connect_via()裝飾器你也能夠輕易地訂閱信號:

代碼如下:

from flask import template_rendered

@template_rendered.connect_via(app)

def when_template_rendered(sender, template, context, **extra):

    print 'Template %s is rendered with %s' % (template.name, context)

舉例

模板渲染

template_rendered信號是Flask核心信號。

當一個模版成功地渲染,這個信號會被發送。這個信號與模板實例 template 和上下文的詞典(名為 context )一起調用。

信號發送:

代碼如下:

def _render(template, context, app):

    """Renders the template and fires the signal"""

    rv = template.render(context)

    template_rendered.send(app, template=template, context=context)

    return rv

訂閱示例:

代碼如下:

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)

帳號追蹤

user_logged_in是Flask-User中定義的信號,當用戶成功登入之后,這個信號會被發送。

發送信號:

代碼如下:

# Send user_logged_in signal

user_logged_in.send(current_app._get_current_object(), user=user)

下面這個例子追蹤登錄次數和登錄IP:

代碼如下:

# This code has not been tested

from flask import request

from flask_user.signals import user_logged_in

@user_logged_in.connect_via(app)

def _track_logins(sender, user, **extra):

    user.login_count += 1

    user.last_login_ip = request.remote_addr

    db.session.add(user)

    db.session.commit()

小結

信號可以讓你在一瞬間安全地訂閱它們。例如,這些臨時的訂閱對測試很有幫助。使用信號時,不要讓信號訂閱者(接收者)發生異常,因為異常會造成程序中斷。

更多信息請查看IT技術專欄

更多信息請查看腳本欄目
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
伊人久久男人天堂| 1769国内精品视频在线播放| 国产精品久久久| 国产精品99久久久久久人| 欧美午夜电影在线| 亚洲已满18点击进入久久| 国产精品日韩欧美一区二区三区| 香蕉成人久久| 在线观看日韩av电影| 欧美福利一区| 亚洲综合精品| 在线精品视频在线观看高清| 欧美精品在线看| 中文精品99久久国产香蕉| 国产日韩欧美不卡| 噜噜噜噜噜久久久久久91| 一本不卡影院| 黄色成人在线观看| 欧美三级不卡| 久久资源在线| 亚洲男同1069视频| 亚洲精品三级| 激情综合色综合久久综合| 欧美日韩中文字幕日韩欧美| 久久久精品动漫| 99re热这里只有精品免费视频| 国产精品一区免费视频| 欧美精品三级在线观看| 久久久久青草大香线综合精品| av不卡在线| 亚洲成人中文| 国产午夜精品麻豆| 国产精品久久久久9999高清 | 亚洲视频在线一区观看| 国产午夜精品一区二区三区视频| 欧美精品一区二区精品网| 久久久999精品免费| 亚洲资源在线观看| 99精品视频免费全部在线| 精品va天堂亚洲国产| 国产精品网站在线观看| 欧美日韩一区二区三区四区五区| 久久尤物电影视频在线观看| 午夜激情一区| 亚洲欧美国产另类| 亚洲视频图片小说| 日韩一本二本av| 亚洲国产导航| 一区在线免费观看| 国精产品99永久一区一区| 国产欧美精品日韩| 91久久线看在观草草青青| 国产精品亚洲一区| 国产精品v欧美精品v日韩精品| 欧美国产成人在线| 欧美大胆成人| 欧美激情91| 欧美区一区二区三区| 欧美国产日韩亚洲一区| 老司机精品导航| 免费亚洲网站| 欧美高清一区| 欧美日韩国产123| 欧美日韩精品一二三区| 欧美日韩在线视频一区| 欧美日韩精品综合| 欧美午夜一区二区三区免费大片 | 国产精品免费在线| 国产精品视频免费观看www| 国产精品白丝av嫩草影院| 欧美日韩日本网| 国产精品都在这里| 国产女人18毛片水18精品| 国产一区二区三区四区在线观看 | 在线观看不卡| 在线观看国产精品淫| 亚洲国产经典视频| 亚洲伦理在线观看| 亚洲一级片在线看| 性久久久久久久久| 久久激情五月丁香伊人| 美日韩精品免费观看视频| 欧美大色视频| 欧美日韩一区二区在线视频| 国产乱人伦精品一区二区| 狠狠色狠狠色综合| 一本一本久久a久久精品牛牛影视| 亚洲图片自拍偷拍| 久久精品视频在线| 欧美精品激情在线| 国产伦精品一区二区三区高清| 精品999成人| 一本久久综合| 久久久视频精品| 欧美日韩高清在线一区| 国产欧美在线视频| 亚洲精选91| 久久国产精品黑丝| 欧美日本乱大交xxxxx| 国产夜色精品一区二区av| 亚洲欧洲久久| 性刺激综合网| 欧美日韩一区二区在线播放| 国产一区二区日韩精品| 99精品国产在热久久| 久久久国产91| 国产精品免费看| 亚洲免费成人av电影| 久久偷窥视频| 国产欧美婷婷中文| 艳女tv在线观看国产一区| 久久亚洲一区二区| 国产女主播一区二区| 99国产精品久久久久久久| 另类成人小视频在线| 国产亚洲一本大道中文在线| 洋洋av久久久久久久一区| 欧美成年人视频| 尤物精品在线| 欧美亚洲在线视频| 国产精品女主播一区二区三区| 亚洲日本一区二区| 能在线观看的日韩av| 伊人婷婷欧美激情| 欧美性色视频在线| 日韩一区二区精品视频| 牛牛影视久久网| 亚洲成在人线av| 久久久久免费观看| 韩国精品在线观看| 久久久国产一区二区| 国产精品系列在线| 午夜精品久久久久久久久| 国产精品高潮久久| 亚洲中字黄色| 国产精品亚洲美女av网站| 亚洲欧美日韩国产一区二区| 国产精品高潮呻吟久久| 亚洲一区网站| 国产欧美欧美| 久久精品国产亚洲一区二区| 国产一区二区三区免费观看| 久久黄色网页| 亚洲电影av在线| 欧美激情欧美激情在线五月| 亚洲精品欧洲精品| 欧美视频一区二区三区…| 亚洲一区自拍| 国产一区二区三区高清| 麻豆成人91精品二区三区| 亚洲国产精品99久久久久久久久| 免费一区二区三区| 一区二区日本视频| 国产精品一卡二| 久久精品中文字幕一区二区三区| 韩日精品在线| 欧美福利电影网| 国产精品99久久久久久有的能看| 国产精品久久久久9999吃药| 欧美一区二区三区免费看| 在线免费观看成人网| 欧美人成在线视频| 亚洲欧美综合一区| 亚洲国产裸拍裸体视频在线观看乱了中文| 欧美福利精品| 西西人体一区二区| 亚洲国产激情| 国产精品资源| 欧美国产精品日韩| 性刺激综合网| 91久久在线| 国产香蕉97碰碰久久人人| 欧美国产日韩精品| 午夜亚洲影视| 亚洲精品一区在线观看香蕉| 国产欧美精品日韩区二区麻豆天美| 久久免费视频一区| 亚洲永久网站| 亚洲精选在线| 精品成人一区二区三区四区| 欧美天堂在线观看| 老司机久久99久久精品播放免费 | 欧美精品一区二区三| 亚洲综合不卡| 91久久久在线| 国产欧美一区二区三区久久人妖| 欧美成人午夜| 久久精品在线| 亚洲欧美日韩国产综合精品二区| 极品av少妇一区二区| 国产精品久久久对白| 女同一区二区| 久久久噜噜噜久噜久久| 亚洲综合国产精品| 亚洲免费电影在线| 激情综合五月天| 国产日韩欧美在线| 国产精品久久久久久五月尺| 欧美高清在线| 免费观看一区|