前言

Django的信号要从一张抽象图和一个需求说起;

赛道:Django

赛车:http请求

基础设施:Django设置的信号

一、Django内置信号类型

1、既然赛道上有各种基础设置,那么Django里面又内置了哪些信号呢?

Model signals
pre_init # django的modal执行其构造方法前,自动触发
post_init # django的modal执行其构造方法后,自动触发
pre_save # django的modal对象保存前,自动触发
post_save # django的modal对象保存后,自动触发
pre_delete # django的modal对象删除前,自动触发
post_delete # django的modal对象删除后,自动触发
m2m_changed # django的modal中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发
class_prepared # 程序启动时,检测已注册的app中modal类,对于每一个类,自动触发 Management signals
pre_migrate # 执行migrate命令前,自动触发
post_migrate # 执行migrate命令后,自动触发 Request/response signals
request_started # 请求到来前,自动触发
request_finished # 请求结束后,自动触发
got_request_exception # 请求异常后,自动触发 Test signals
setting_changed # 使用test测试修改配置文件时,自动触发
template_rendered # 使用test测试渲染模板时,自动触发 Database Wrappers
connection_created # 创建数据库连接时,自动触发

2、需求:如何在每次数据库添加操作之后,记录一条行为日志呢?

切入点:post_save # django的modal对象保存后,自动触发(Django的orm在执行create操作,内部也会执行save方法)

3、见识了信号之后疑惑信号和中间件的区别?

中间件只是能设置在Django的出口和入口,而中间件散步较广;

二、应用信号

对于Django内置的信号,仅需注册指定信号,当程序执行相应操作时,自动触发注册函数:

1、导入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

2、注册信号

为了确保你的程序在启动后就会导入和注册信号,一定要放在Django程序目录的__init__.py文件里

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(sender) #操作的那张表
print(kwargs['instance'].name) #获取增加的那样记录的 name pre_save.connect(callback)

二、自定义信号

如果Django自定制的信息无法满足你的需求还可以自定制信号

1.定义注册

# 自定义信号
import django.dispatch
pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])
def callback1(sender,**kwargs):
print('这是一个自定义信号')
print(sender) #操作的那张表
print(kwargs) #获取增加的那样记录的 pizza_done.connect(callback1)

2、导入执行

def index(request):
userlist=models.UserInfo.objects.all()
ctime=time.time()
from django缓存 import pizza_done
a=models.UserInfo.objects.create(name='xxx',pwd='')
pizza_done.send(sender=a.name,pwd=a.pwd) #调用自定义信号必须传sender参数
return render(request,'index.html',locals())

三、序列化

json模块默认能处理的Python数据类型有限,在使用Django做web开发的时候如何 序列化 query_set和时间数据类型呢?

+---------------+-------------------+
| JSON | Python |
+===============+===================+
| object | dict |
+---------------+-------------------+
| array | list |
+---------------+-------------------+
| string | str |
+---------------+-------------------+
| number (int) | int |
+---------------+-------------------+
| number (real) | float |
+---------------+-------------------+
| true | True |
+---------------+-------------------+
| false | False |
+---------------+-------------------+
| null | None |
+---------------+-------------- 如何破解? 1、serializers(Django自带的序列化工具)
from django.core import serializers
def index(request):
userlist=models.UserInfo.objects.all()
# 方案1
userlist_str=serializers.serialize('json',userlist)
print(userlist_str)
ctime=time.time()

2、自定制  json.dumps方法中cls参数(serializers内部也是这样实现的

vale=json.dumps(userlist,cls=json.JSONEncoder)
from datetime import datetime
from datetime import date
import json
#自定义一个类,由于Python的一数据类型,json可以序列化,所有可以继承json.JSONEncoder方法
class JsonCustomEncoder(json.JSONEncoder):
def default(self, field): if isinstance(field, datetime):
return field.strftime('%Y-%m-%d %H:%M:%S')
elif isinstance(field,date ):
return field.strftime('%Y-%m-%d')
else:
return json.JSONEncoder.default(self, field)
data_list=[
{'name':'eric0','age':18,'ctime':datetime.now()},
{'name':'eric1','age':18,'ctime':datetime.now()},
{'name':'eric2','age':18,'ctime':datetime.now()}
] str1=json.dumps(data_list, cls=JsonCustomEncoder)
print(str1)
 

Django之信号和序列化的更多相关文章

  1. django缓存、信号、序列化

    本篇导航: Django的缓存机制 Django的信号 Django的序列化 一.Django的缓存机制 1.缓存介绍 1)缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增, ...

  2. Django组件补充(缓存,信号,序列化)

    Django组件补充(缓存,信号,序列化) Django的缓存机制 1.1 缓存介绍 1.缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑 ...

  3. Django缓存,信号,序列化

    缓存 1.缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次的的后台操作 ...

  4. Django--缓存、信号、序列化

    一 Django的缓存机制 1.1 缓存介绍 1.缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的 ...

  5. django signals 信号

    django signals 信号 配置方式 app下的 __init__.py default_app_config="web.apps.WebConfig" #初始化app配置 ...

  6. Django Rest framework 之 序列化

    RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...

  7. Django 之 信号机制

    Django 之 信号机制 Django提供一种信号机制.其实就是观察者模式,又叫发布-订阅(Publish/Subscribe) . 当发生一些动作的时候,发出信号,然后监听了这个信号的函数就会执行 ...

  8. Django 的信号 & Flask 的信号

    信号:框架内部已帮助开发者预留的可扩展的位置 一.Django 的信号 项目目录结构: django_signal |--- app01 |--- models.py |--- views.py .. ...

  9. 关于Django中,实现序列化的几种不同方法

    前言 关于序列化操作,就是将一个可迭代的数据结构,通过便利的方式进行我们所需要的操作. 今天历来归纳一下,Django中的几种不同得分方法,已经Django-restframework提供的方法 创建 ...

随机推荐

  1. 项目Alpha冲刺--4/10

    项目Alpha冲刺--4/10 1.团队信息 团队名称:基于云的胜利冲锋队 成员信息 队员学号 队员姓名 个人博客地址 备注 221500201 孙文慈 https://www.cnblogs.com ...

  2. 真刀实战地搭建React+Webpack+Express搭建一个简易聊天室

    一.前面bb两句 因为自惭(自残)webpack配置还不够熟悉,想折腾着做一个小实例熟悉.想着七夕快到了,做一个聊天室自己和自己聊天吧哈哈.好了,可以停止bb了,说一下干货. 二. 这个项目能学到啥? ...

  3. Codeforces Round #290 (Div. 2) E. Fox And Dinner 网络流建模

    E. Fox And Dinner time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  4. hdu 5676 ztr loves lucky numbers 打表+二分

    ztr loves lucky numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/ ...

  5. zipkin启动报错(Caused by: java.lang.ClassNotFoundException: zipkin.Component)的解决方法

    使用ziplin依赖: <dependency> <groupId>org.springframework.cloud</groupId> <artifact ...

  6. .net unicode汉字互相转换

    [两种方法].net unicode汉字互相转换 ========================================= //汉字转Unicode编码(ASCII) private str ...

  7. C#引用出错

    今天有朋友问我为什么自己引用了配置文件,但是还不能使用配置文件呢? 之后我查看他的项目,后来发现如下问题,并且总结引用文件流程如下: 引用文件的完整程序如下: 用配置文件举例 项目中的引用右击,然后点 ...

  8. 如何看待Arcsoft虹软,推出的人脸认知引擎免费SDK?

    虹软公司是一家具有硅谷背景的图像处理公司,除了人脸技术以外,还有多项图像及视频处理技术.他们的双摄像头处理算法和人脸美化算法囊括了包括OPPO VIVO,SUMAMNG一系列手机厂商. 整个人脸识别运 ...

  9. cyberduck的SSH登录

    1.通过配置SSH秘钥. 2.不点匿名(不要点匿名),如果非要填一个名字的话,你写root就行. 3.书签.

  10. 昂达 v891 连接上adb 调试

    这篇文章可以删除了.  可以看看有关v891root和分区的文章,里面介绍了驱动程序的工具了. USB线连上之后,可以直接访问文件,所以连接本身肯定没有问题的. 可是,总是Windows 那边MTP驱 ...