django开发-signals信号的使用

django中提供了信号机制,我们可以自定义需要执行的函数,当某个动作(如model对象被保存)发生时,可以触发自定义函数的执行。

django中有内置的信号,我们也可以自定义信号。

django中有以下常用内置信号:

django.db.models.signals.pre_save 在某个Model保存之前调用
django.db.models.signals.post_save 在某个Model保存之后调用
django.db.models.signals.pre_delete 在某个Model删除之前调用
django.db.models.signals.post_delete 在某个Model删除之后调用
django.core.signals.request_started 在建立Http请求时发送
django.core.signals.request_finished 在关闭Http请求时发送

其他内置信号可以查看官方文档:

https://docs.djangoproject.com/en/2.1/topics/signals/

下面介绍下内置信号和自定义信号的使用。

1.内置信号

下面举一个post_save的例子,test01是app名称。

1.1 首先在test01/signals/handler.py中定义signal函数

django开发-signals信号的使用

1.2 test01/views.py中定义视图

django开发-signals信号的使用

1.3 配置

test01/apps.py:

django开发-signals信号的使用

test01/__init__.py:

default_app_config = 'test01.apps.Test01AppConfig'

1.4 此时在postman中分别请求下面两个url:

http://127.0.0.1:8000/test01/user/

http://127.0.0.1:8000/test01/student/

打印的结果分别是:

django开发-signals信号的使用

通过上面的结果,我们也可以看出信号中使用和不使用sender参数区别。

2.自定义信号

下面介绍下自定义信号的使用。

2.1 定义信号

test01/signals/signals.py:

django开发-signals信号的使用

2.2 在视图中触发自定义信号

test01/views.py:

django开发-signals信号的使用

2.3 编写处理函数,即收到信号后要做哪些操作

test01/signals/handler.py:

django开发-signals信号的使用

2.4 配置,与内置信号中的配置相同

2.5 请求下面的url

http://127.0.0.1:8000/test01/signal/

看到打印的结果如下:

my signal: signal_view {‘signal’: <django.dispatch.dispatcher.signal>, ‘p1’: ‘wyzane’, ‘p2’: 18}/<django.dispatch.dispatcher.signal>

3.补充

我们配置的时候使用了AppConfig,下面补充下AppConfig的知识。

AppConfig是用来设置每个app属性的,上面的配置中定义了一个Test01AppConfig类来继承AppConfig,并在__init__.py中使用default_app_config来加载这个类。

重写在ready方法中的代码会在django运行的时候执行。

感兴趣的小伙伴可以看下官方文档的介绍:

https://docs.djangoproject.com/en/2.1/ref/applications/

今天就介绍到这里,如有问题欢迎私信交流。


分享到:


相關文章: