国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

深入理解Django-Signals信號量

2020-02-16 01:13:37
字體:
來源:轉載
供稿:網友

定義Signals

Django自身提供了一些常見的signal,用戶本身也可以定義自己需要的signal

定義signal很簡單,只需要實例化一個Signal實例即可

實例化Signal時,可以傳入關鍵詞參數providing_args, providing_args是一個列表,列表中定義了當前signal調用send方法時可以傳入的參數。

# django.core.signals.pyfrom django.dispatch import Signalrequest_started = Signal(providing_args=["environ"])request_finished = Signal()got_request_exception = Signal(providing_args=["request"])setting_changed = Signal(providing_args=["setting", "value", "enter"])

其中Signal的初始化也比較簡單,就是為實例化的signal定義一個線程鎖

class Signal(object):  def __init__(self, providing_args=None, use_caching=False):    self.receivers = []    if providing_args is None:      providing_args = []    self.providing_args = set(providing_args)    self.lock = threading.Lock()    self.use_caching = use_caching    # For convenience we create empty caches even if they are not used.    # A note about caching: if use_caching is defined, then for each    # distinct sender we cache the receivers that sender has in    # 'sender_receivers_cache'. The cache is cleaned when .connect() or    # .disconnect() is called and populated on send().    self.sender_receivers_cache = weakref.WeakKeyDictionary() if use_caching else {}    self._dead_receivers = False

定義Signal處理函數

Signal處理函數是一個函數或者是一個實例的方法,并且必須滿足下面條件:

    hashable 可以接收關鍵詞參數

其中處理函數必須包含的關鍵詞參數有兩個:

signal,要接收的Signal實例 sender,要接收的Signal觸發者
# django.db.__init__.pyfrom django.core import signalsfrom django.db.utils import ConnectionHandlerconnections = ConnectionHandler()def reset_queries(**kwargs):  for conn in connections.all():    conn.queries_log.clear()signals.request_started.connect(reset_queries)def close_old_connections(**kwargs):  for conn in connections.all():    conn.close_if_unusable_or_obsolete()signals.request_started.connect(close_old_connections)signals.request_finished.connect(close_old_connections)

處理函數綁定Signal

django提供了兩種方法可以將Signal的處理函數和Signal實例進行綁定:

手動調用connect方法 使用裝飾器receiver

其實裝飾器receiver最終還是調用了connect方法將處理函數和Signal實例進行綁定

Signal類的connect方法定義如下:

class Signal(object):  ...    def connect(self, receiver, sender=None, weak=True, dispatch_uid=None):    from django.conf import settings    # If DEBUG is on, check that we got a good receiver    if settings.configured and settings.DEBUG:      assert callable(receiver), "Signal receivers must be callable."      # Check for **kwargs      if not func_accepts_kwargs(receiver):        raise ValueError("Signal receivers must accept keyword arguments (**kwargs).")    if dispatch_uid:      lookup_key = (dispatch_uid, _make_id(sender))    else:      lookup_key = (_make_id(receiver), _make_id(sender))    if weak:      ref = weakref.ref      receiver_object = receiver      # Check for bound methods      if hasattr(receiver, '__self__') and hasattr(receiver, '__func__'):        ref = WeakMethod        receiver_object = receiver.__self__      if six.PY3:        receiver = ref(receiver)        weakref.finalize(receiver_object, self._remove_receiver)      else:        receiver = ref(receiver, self._remove_receiver)    with self.lock:      self._clear_dead_receivers()      for r_key, _ in self.receivers:        if r_key == lookup_key:          break      else:        self.receivers.append((lookup_key, receiver))      self.sender_receivers_cache.clear()            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 温州市| 清丰县| 柳林县| 怀仁县| 商城县| 苍溪县| 定日县| 辽源市| 定结县| 香格里拉县| 罗田县| 谢通门县| 无极县| 兴和县| 栾川县| 信阳市| 新平| 广元市| 天台县| 莱阳市| 南阳市| 抚宁县| 梅河口市| 嘉黎县| 叶城县| 新巴尔虎右旗| 东明县| 舟曲县| 讷河市| 浙江省| 佛山市| 大渡口区| 黄大仙区| 怀安县| 政和县| 外汇| 苏尼特左旗| 视频| 逊克县| 盱眙县| 安义县|