django 自定義信號 1.11
阿新 • • 發佈:2019-01-07
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_exceptionfrom 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 importpre_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