django 信号和缓存使用
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 # 创建数据库连接时,自动触发
实现: (以下代码添加到project的__init__.py文件中)
from django.db.models.signals import pre_save def callback(sender, **kwargs): print("xxoo_callback") print(sender, kwargs) pre_save.connect(callback)
django 缓存
由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到,并返回。
Django中提供了6种缓存方式:
- 开发调试
- 内存
- 文件
- 数据库
- Memcache缓存(python-memcached模块)
- Memcache缓存(pylibmc模块)
配置:
1开发调试
2内存
3文件
4数据库
5缓存数据库redis等
配置实例:
在settings.py中设置
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': '/var/tmp/django_cache', } }
应用:
1全栈缓存(基于中间件实现)
2视图函数缓存(基于装饰器实现)
3模板局部缓存
应用实例:
a. 写中间件 MIDDLEWARE = [ # 'django.middleware.cache.UpdateCacheMiddleware', # 打开此注释使用缓存 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', # 'django.middleware.cache.FetchFromCacheMiddleware',# 打开此注释使用缓存 ] b. 装饰器 from django.shortcuts import render,HttpResponse from app01 import models from django.views.decorators.cache import cache_page import time @cache_page(60 * 15) def users(request): ctime = str(time.time()) return HttpResponse(ctime) c. 模板 {% load cache %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>{{ ctime }}</h1> {% cache 5000 xxxxx %} {{ ctime }} {% endcache %} </body> </html>