django 信號介紹 1.11
阿新 • • 發佈:2019-01-07
server 啟動 來講 pla 模塊 bre res Django項目 image
Django中提供了“信號調度”,用於在框架執行操作時解耦。通俗來講,就是一些動作發生的時候,信號允許特定的發送者去提醒一些接受者
1、Django內置信號
Model signals pre_init # django的modal執行其構造方法前,自動觸發 post_init # django的modal執行其構造方法後,自動觸發 pre_save # django的modal對象保存前,自動觸發 post_save #django的modal對象保存後,自動觸發 pre_delete # django的modal對象刪除前,自動觸發 post_delete # django的modal對象刪除後,自動觸發 m2m_changed # django的modal中使用m2m字段操作第三張表(add,remove,clear)前後,自動觸發 class_prepared # 程序啟動時,檢測已註冊的app中modal類,對於每一個類,自動觸發 Management signals pre_migrate# 執行migrate命令前,自動觸發 post_migrate # 執行migrate命令後,自動觸發 Request/response signals request_started # 請求到來前,自動觸發 request_finished # 請求結束後,自動觸發 got_request_exception # 請求異常後,自動觸發 Test signals setting_changed # 使用test測試修改配置文件時,自動觸發 template_rendered #使用test測試渲染模板時,自動觸發 Database Wrappers connection_created # 創建數據庫連接時,自動觸發
這個信號 django內部已經全部定死 已經埋下觸發信號操作
於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 def callback(sender, **kwargs): print("xxoo_callback") print(sender,kwargs) xxoo.connect(callback) # xxoo指上述導入的內容
xxoo是什麽 比如
.connect() 裏面 傳的 是一個自定義函數 代表在信號裏面 註冊一個函數
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 def f1(sender, **kwargs): print("end") pre_init.connect(f1)
也可以註冊多個函數 按照順序執行
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 def f1(sender, **kwargs): print("end") def f2(sender, **kwargs): print("end22") pre_init.connect(f1) pre_init.connect(f2)
想在django 應用 註冊的函數的 信號註冊到django
在django項目 創建一個sg.py 文件
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 def f1(sender, **kwargs): print("xxoo") pre_init.connect(f1)
django執行 models構造方法前 自動觸發信號
在django項目中的 __init__.py 文件 導入 sg.py 模塊 那就django程序一運行,自動把sg.py 代碼加載到內存,然後相應信號函數就註冊了
urls.py signal函數
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), ]
views.py signal函數 用來測試註冊的信號
def signal(request): from app01 import models obj = models.UserInfo(username=‘mike‘) print("end") obj.save() obj = models.UserInfo(username=‘mike‘) print("end1") obj.save() obj = models.UserInfo(username=‘mike‘) print("end2") obj.save() return HttpResponse("ok")
一啟動django 註冊的函數馬上加載到內存了
xxoo xxoo System check identified no issues (0 silenced). January 07, 2019 - 17:17:06 Django version 1.11, using settings ‘day21django.settings‘ Starting development server at http://127.0.0.1:8000/ Quit the server with CTRL-BREAK
執行django signal url
後臺拿到信息
每一次 執行 models構造方法前 自動觸發信號 函數 然後打印信息
mike jack tom 小張 小剛 老張 xxoo end xxoo end1 xxoo end2 xiaogang xiaoming peter [07/Jan/2019 17:25:01] "GET /signal/ HTTP/1.1" 200 2
django 信號介紹 1.11