django 自定义信号 1.11

Posted mingerlcm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django 自定义信号 1.11相关的知识,希望对你有一定的参考价值。

 

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的主要内容,如果未能解决你的问题,请参考以下文章

django 信号介绍 1.11

[TimLinux] Django 信号

Django Template层之自定义tag

django 1.11 目录

升级到 django 1.11 多对多列未找到

在 Django 1.11 中启用 CORS