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函数
1.2 test01/views.py中定义视图
1.3 配置
test01/apps.py:
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/
打印的结果分别是:
通过上面的结果,我们也可以看出信号中使用和不使用sender参数区别。
2.自定义信号
下面介绍下自定义信号的使用。
2.1 定义信号
test01/signals/signals.py:
2.2 在视图中触发自定义信号
test01/views.py:
2.3 编写处理函数,即收到信号后要做哪些操作
test01/signals/handler.py:
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/
今天就介绍到这里,如有问题欢迎私信交流。
閱讀更多 贊哥哥 的文章