1. 程式人生 > >django 信號介紹 1.11

django 信號介紹 1.11

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