Django中提供了“信號(hào)調(diào)度”,用于在框架執(zhí)行操作時(shí)解耦。通俗來講,就是一些動(dòng)作發(fā)生的時(shí)候,信號(hào)允許特定的發(fā)送者去提醒一些接受者。
123456789101112131415161718192021 | Model signals ???? pre_init??????????????????? # django的model執(zhí)行其構(gòu)造方法前,自動(dòng)觸發(fā) ???? post_init?????????????????? # django的model執(zhí)行其構(gòu)造方法后,自動(dòng)觸發(fā) ???? pre_save??????????????????? # django的model對(duì)象保存前,自動(dòng)觸發(fā) ???? post_save?????????????????? # django的model對(duì)象保存后,自動(dòng)觸發(fā) ???? pre_delete????????????????? # django的model對(duì)象刪除前,自動(dòng)觸發(fā) ???? post_delete???????????????? # django的model對(duì)象刪除后,自動(dòng)觸發(fā) ???? m2m_changed???????????????? # django的model中使用m2m字段操作第三張表(add,remove,clear)前后,自動(dòng)觸發(fā) ???? class_prepared????????????? # 程序啟動(dòng)時(shí),檢測(cè)已注冊(cè)的app中modal類,對(duì)于每一個(gè)類,自動(dòng)觸發(fā) Management signals ???? pre_migrate???????????????? # 執(zhí)行migrate命令前,自動(dòng)觸發(fā) ???? post_migrate??????????????? # 執(zhí)行migrate命令后,自動(dòng)觸發(fā) Request / response signals ???? request_started???????????? # 請(qǐng)求到來前,自動(dòng)觸發(fā) ???? request_finished??????????? # 請(qǐng)求結(jié)束后,自動(dòng)觸發(fā) ???? got_request_exception?????? # 請(qǐng)求異常后,自動(dòng)觸發(fā) Test signals ???? setting_changed???????????? # 使用test測(cè)試修改配置文件時(shí),自動(dòng)觸發(fā) ???? template_rendered?????????? # 使用test測(cè)試渲染模板時(shí),自動(dòng)觸發(fā) Database Wrappers ???? connection_created????????? # 創(chuàng)建數(shù)據(jù)庫連接時(shí),自動(dòng)觸發(fā) |
對(duì)于Django內(nèi)置的信號(hào),僅需注冊(cè)指定信號(hào),當(dāng)程序執(zhí)行相應(yīng)操作時(shí),自動(dòng)觸發(fā)注冊(cè)函數(shù):
注冊(cè)信號(hào),寫入與project同名的文件夾下的_init_.py文件中,也是換數(shù)據(jù)庫引擎的地方。
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指上述導(dǎo)入的內(nèi)容View Code
def my_callback(sender, **kwargs): print("Request finished!")# 方法一:from django.core.signals import request_finishedrequest_finished.connect(my_callback)# 方法二:from django.core.signals import request_finishedfrom django.dispatch import receiver@receiver(request_finished)def my_callback(sender, **kwargs): print("Request finished!")示例
from django.db.models.signals import pre_savefrom django.dispatch import receiverfrom myapp.models import MyModel@receiver(pre_save, sender=MyModel)def my_handler(sender, **kwargs): ...指定發(fā)送者
a. 定義信號(hào)
在某py文件中定義信號(hào)。
?12 | import django.dispatch pizza_done = django.dispatch.Signal(providing_args = [ "toppings" , "size" ]) |
b. 注冊(cè)信號(hào)
在_init_.py 中注冊(cè)信號(hào)
?12345 | def callback(sender, * * kwargs): ???? print ( "callback" ) ???? print (sender,kwargs) ?pizza_done.connect(callback) |
c. 觸發(fā)信號(hào)
?123 | from 路徑 import pizza_done ?pizza_done.send(sender = 'seven' ,toppings = 123 , size = 456 ) |
由于內(nèi)置信號(hào)的觸發(fā)者已經(jīng)集成到Django中,所以其會(huì)自動(dòng)調(diào)用,而對(duì)于自定義信號(hào)則需要開發(fā)者在任意位置觸發(fā)。
更多:猛擊這里
關(guān)于Django中的序列化主要應(yīng)用在將數(shù)據(jù)庫中檢索的數(shù)據(jù)返回給客戶端用戶,特別的Ajax請(qǐng)求一般返回的為Json格式。
1、serializers
?12345 | from django.core import serializers ?ret = models.BookType.objects. all () ?data = serializers.serialize( "json" , ret) |
2、json.dumps
?12345678 | import json ?#ret = models.BookType.objects.all().values('caption') ret = models.BookType.objects. all ().values_list( 'caption' ) ?ret = list (ret) ?result = json.dumps(ret) |
由于json.dumps時(shí)無法處理datetime日期,所以可以通過自定義處理器來做擴(kuò)展,如:
View Code?1234567891011121314151617 | import json? from datetime import date? from datetime import datetime? ?? ?class JsonCustomEncoder(json.JSONEncoder):? ??? ????? def default( self , field):? ???? ????????? if isinstance (field, datetime):? ???????????? return o.strftime( '%Y-%m-%d %H:%M:%S' )? ???????? elif isinstance (field, date):? ???????????? return o.strftime( '%Y-%m-%d' )? ???????? else :? ???????????? return json.JSONEncoder.default( self , field)? ?? ??? ?# ds = json.dumps(d, cls=JsonCustomEncoder)? |
聯(lián)系客服