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/
今天就介紹到這裡,如有問題歡迎私信交流。
閱讀更多 贊哥哥 的文章