Python 26 Django缓存、序列化、信号、debug工具
一、缓存
1、配置
CACHES = { 'default' = { 'BACKEND': 'django.core.cache.backend.locmem.LocMemCache', # 这是保存到内存中 'LOCATION': 'unique-snowflake', # 这是唯一标识 'TIMEOUT': 300, # 超时时间,默认300,None为永不过期,0表示立即过期 'OPTIONS': { 'MAX_ENTRIES': 300, # 最大缓存个数,默认300 'CULL_FREQUENCY': 3, # 缓存到达最大个数后,剔除的比例,即三分之一 } } }
CACHES = { 'default' = { 'BACKEND': 'django.core.cache.backend.filebased.FileBasedCache', # 这是保存到文件中 'LOCATION': 'E://xxx', # 这是保存的路径 'TIMEOUT': 300, # 超时时间,默认300,None为永不过期,0表示立即过期 'OPTIONS': { 'MAX_ENTRIES': 300, # 最大缓存个数,默认300 'CULL_FREQUENCY': 3, # 缓存到达最大个数后,剔除的比例,即三分之一 } } }
CACHES = { 'default' = { 'BACKEND': 'django.core.cache.backend.dummy.DummyCache', # 这里表示不作任何缓存,只是占位,方便开发调试 'LOCATION': 'unique-snowflake', # 这是唯一标识 'TIMEOUT': 300, # 超时时间,默认300,None为永不过期,0表示立即过期 'OPTIONS': { 'MAX_ENTRIES': 300, # 最大缓存个数,默认300 'CULL_FREQUENCY': 3, # 缓存到达最大个数后,剔除的比例,即三分之一 } } }
2、应用
① 单个缓存
from django.views.decorators.cache import cache_page @cache_page(15) # 在十五秒内再次访问,不会打印111,即使数据库更新,也不会在该时间内刷新页面数据 def user_list(request): print("111") return render(request, 'xx.html')
② 全站缓存
# 获取缓存需要在最后一个request_process中获取,因为前面的中间件可能会对数据进行一些操作或者校验,比如csrf。因此,需要把获取缓存的中间件放在中间件配置的最后 # 存放缓存需要在最后一个process_response中存放,因为前面的中间件可能会对数据进行一些处理。因此需要把存放缓存的中间件放在中间件配置的开头 MIDDLEWARE = { 'django.middleware.cache.UpdateCacheMiddleware', # 其他中间件 'django.middleware.cache.FetchCacheMiddleware', } CACHE_MIDDLEWARE_SECONDS = 300 # 超时时间,默认300
③ 局部缓存
{% load cache %}
{% cache 100 'xx' %} 传入一个超时时间,一个键名
放一些数据
{% endcache %}
二、序列化
序列化就是将数据转化成可识别、可传输的字符串格式
json默认不能序列化时间对象,但是可以自定义类来实现对时间对象的序列化。
import json class JsonCustomerEncoder(json.Encoder): def default(self, field): if isinstance(field, datetime): return field.strftime("%Y-%m-%h %H-%M-%S") elif isinstance(field, date): return dield.strftime("%Y-%m-%h") else: return json.JsonEncoder.default(self, field) json.dumps(date, cls=JsonCustomerEncoder)
三、信号
信号是django给开发者预留的一些操作,遍布在django的请求生命周期中,可以在触发信号的时候进行一些自定义操作。
Model signals pre_init # django的model执行其构造方法前,自动触发 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 # 创建数据库连接时,自动触发
使用:
在__init__中写
from django.dispatch import receiver from django.db.models.signals import post_save # 方式一 def callback(sender, **kwargs): print(sender) post_save.connect(callback)
# 方式二 @recevier(post_save) def callback(sender, **kwargs): print(sender)
四、debug工具django-debug-toolbar
django-debug-toolbar 是一组可配置的面板,可显示有关当前请求/响应的各种调试信息,并在单击时显示有关面板内容的更多详细信息。
pip3 install django-debug-toolbar
1、在settings.py中
INSTALLED_APPS = [ 'debug_toolbar', ]
# 配置中间件
MIDDLEWARE = [
'debug_toolbar.middleware.DebugToolbarMiddleware',
]
# 配置jquery
DEBUG_TOOLBAR_CONFIG = {
"JQUERY_URL": '//cdn.bootcss.com/jquery/2.2.4/jquery.min.js',
}
INTERNAL_IPS = [‘127.0.0.1’, ] # 如果是本机调试
2、在urls.py中
from django.conf import settings from django.conf.urls import include, url if settings.DEBUG: import debug_toolbar urlpatterns = [ url(r'^__debug__/', include(debug_toolbar.urls)), ] + urlpatterns