1. 程式人生 > >django 自定義信號 1.11

django 自定義信號 1.11

dispatch views clu esp ini 自動 backend span pos

django 還支持自定義信號

需要步驟

1. 創建信號

import django.dispatch

# 信號名
pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])

這個信號名相當於 django 內置的信號 導入的模塊一樣

from django.core.signals import request_finished
from django.core.signals import request_started
from django.core.signals import got_request_exception

from django.db.models.signals import class_prepared from django.db.models.signals import pre_init, post_init from django.db.models.signals import pre_save, post_save from django.db.models.signals import pre_delete, post_delete from django.db.models.signals import m2m_changed from django.db.models.signals import
pre_migrate, post_migrate from django.test.signals import setting_changed from django.test.signals import template_rendered from django.db.backends.signals import connection_created

後面 ["toppings", "size"] 是觸發者傳遞的兩個參數,觸發這個信號傳遞的參數

2.註冊信號

註冊函數

def callback(sender, **kwargs):
    print("callback
") print(sender,kwargs) pizza_done.connect(callback)

3.觸發信號

from 路徑 import pizza_done
 
pizza_done.send(sender=seven,toppings=123, size=456)

實驗開始 在django 項目下 創建一個 pg.py 存放自己創建信號的代碼 或者 其他目錄下

技術分享圖片

import django.dispatch

# 信號名
pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])


def f1(sender, **kwargs):
    print("callback")
    print(sender, kwargs)


pizza_done.connect(f1)

urls.py 新添加 test2 url路由關系

from django.conf.urls import url
from django.contrib import admin
from django.conf.urls import include
from app01 import views

urlpatterns = [
    # url(r‘^admin/‘, admin.site.urls),
    url(r^login/, views.login),
    url(r^index/, views.index),
    url(r^logout/, views.logout),
    url(r^test/, views.test),
    url(r^cache/, views.cache),
    url(r^signal/, views.signal),
    url(r^test2/, views.test2),
]


在viwes.py test2函數觸發信號

導入pg.py 模塊

def test2(request):
    
    from pg import pizza_done
    # 觸發信號,要想觸發需要加參數 想什麽寫就什麽寫
    pizza_done.send(sender="asdasda",toppings=123, size=456)

    print("ok")
    return HttpResponse("自定義信號")

執行url

技術分享圖片

後臺拿到信息

mike
jack
tom
小張
小剛
老張
callback
asdasda {‘signal‘: <django.dispatch.dispatcher.Signal object at 0x00000000045F1C88>, ‘toppings‘: 123, ‘size‘: 456}
ok
xiaogang
xiaoming
peter
[07/Jan/2019 18:06:06] "GET /test2/ HTTP/1.1" 200 15

由於內置信號的觸發者已經集成到Django中,所以其會自動調用,而對於自定義信號則需要開發者在任意位置觸發。

django 自定義信號 1.11