Django 缓存、信号
Reference: http://www.cnblogs.com/lianzhilei/p/6365877.html
缓存
由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到,并返回
Django中提供了6种缓存方式:
- 开发调试
- 内存
- 文件
- 数据库
- Memcache缓存(python-memcached模块、pylibmc模块)
1、配置
① 开发配置

- # 此为开始调试用,实际内部不做任何操作
- # 配置:
- CACHES = {
- 'default': {
- 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', # 引擎
- 'TIMEOUT': 300, # 缓存超时时间(默认300,None表示永不过期,0表示立即过期)
- 'OPTIONS':{
- 'MAX_ENTRIES': 300, # 最大缓存个数(默认300)
- 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
- },
- 'KEY_PREFIX': '', # 缓存key的前缀(默认空)
- 'VERSION': 1, # 缓存key的版本(默认1)
- 'KEY_FUNCTION' 函数名 # 生成key的函数(默认函数会生成为:【前缀:版本:key】)
- }
- }
- # 自定义key
- def default_key_func(key, key_prefix, version):
- """
- Default function to generate keys.
- Constructs the key used by all other methods. By default it prepends
- the `key_prefix'. KEY_FUNCTION can be used to specify an alternate
- function with custom key making behavior.
- """
- return '%s:%s:%s' % (key_prefix, version, key)
- def get_key_func(key_func):
- """
- Function to decide which key function to use.
- Defaults to ``default_key_func``.
- """
- if key_func is not None:
- if callable(key_func):
- return key_func
- else:
- return import_string(key_func)
- return default_key_func

② 内存配置

- # 此缓存将内容保存至内存的变量中
- # 配置:
- CACHES = {
- 'default': {
- 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
- 'LOCATION': 'unique-snowflake',
- }
- }
- # 注:其他配置同开发调试版本

③ 文件配置
④ 数据库配置
⑤ Memcache缓存(python-memcached模块)
⑥ Memcache缓存(pylibmc模块)
2、应用
① 全站使用

- 使用中间件,经过一系列的认证等操作,如果内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户,当返回给用户之前,判断缓存中是否已经存在,如果不存在则UpdateCacheMiddleware会将缓存保存至缓存,从而实现全站缓存
- MIDDLEWARE = [
- # 写到最上面
- 'django.middleware.cache.UpdateCacheMiddleware',
- # 其他中间件...
- # 写到最下面
- 'django.middleware.cache.FetchFromCacheMiddleware',
- ]

② 单独视图缓存

- 方式一:
- from django.views.decorators.cache import cache_page
- @cache_page(60 * 15)
- def my_view(request):
- ...
- 方式二:
- from django.views.decorators.cache import cache_page
- urlpatterns = [
- url(r'^foo/([0-9]{1,2})/$', cache_page(60 * 15)(my_view)),
- ]

③ 局部视图使用

- a. 引入TemplateTag
- {% load cache %}
- b. 使用缓存
- {% cache 5000 缓存key %}
- 缓存内容
- {% endcache %}

3、单独视图缓存示例
cache方法处理的请求,都进行缓存10秒
HTML文件:

- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Title</title>
- </head>
- <body>
- <h1>{{ ctime }}</h1>
- <h1>{{ ctime }}</h1>
- <h1>{{ ctime }}</h1>
- </body>
- </html>

配置文件:

- CACHES = {
- 'default': {
- 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
- 'LOCATION': os.path.join(BASE_DIR,'cache'),
- }
- }

处理文件:
1
2
3
4
5
6
|
from django.views.decorators.cache import cache_page @cache_page ( 10 ) # 装饰cache方法 def cache(request): import time ctime = time.time() return render(request, 'cache.html' ,{ 'ctime' :ctime}) |
4、局部视图示例
缓存html文件某一部分
HTML文件:
配置文件:
处理文件:
1
2
3
4
|
def cache(request): import time ctime = time.time() return render(request, 'cache.html' ,{ 'ctime' :ctime}) |
5、全局生效
配置文件:
其余文件都一致,全局优先级大;请求流程-->使用中间件,经过一系列的认证等操作,如果内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户,如果不存在则接着往下走,执行views函数,最后经过UpdateCacheMiddleware会将缓存保存至缓存,从而实现全站缓存
信号
Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者
1、Django内置信号
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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、内置信号注册函数
对于内置的信号,使用时需要在信号中注册执行函数,当程序执行相应操作时,自动触发注册函数:
创建文件sg.py并注册函数:
1
2
3
4
5
6
7
8
9
|
# sg.py from django.db.models.signals import pre_init def f1(sender, * * kwargs): print ( "构造方法执行前" ) print (sender, kwargs) pre_init.connect(f1) # django的modal执行其构造方法前,自动触发 可以为内置信号中的任意 |
__init__.py加载文件sg.py:
1
|
import sg |
处理文件views.py:
1
2
3
4
5
6
7
8
9
|
from app01 import models def signal(request): obj1 = models.UserInfo.objects.create(user = "root" ) print ( 'obj1' ) obj2 = models.UserInfo.objects.create(user = "root" ) print ( 'obj2' ) return HttpResponse( "OK" ) |
3、自定义信号
定义信号:
1
2
3
|
import django.dispatch pizza_done = django.dispatch.Signal(providing_args = [ "toppings" , "size" ]) # toppings,size 需要传入的参数 |
注册信号:
1
2
3
4
5
|
def callback(sender, * * kwargs): print ( "callback" ) print (sender,kwargs) pizza_done.connect(callback) |
触发信号:
1
2
3
|
from 路径 import pizza_done pizza_done.send(sender = 'seven' ,toppings = 123 , size = 456 ) |
由于内置信号的触发者已经集成到Django中,所以其会自动调用,而对于自定义信号则需要开发者在任意位置触发
Django 缓存、信号的更多相关文章
- django 缓存信号等
参考别人的博客:写的挺好 http://www.cnblogs.com/wupeiqi/articles/5246483.html
- django缓存、信号、序列化
本篇导航: Django的缓存机制 Django的信号 Django的序列化 一.Django的缓存机制 1.缓存介绍 1)缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增, ...
- django的缓存,信号,序列化
一 Django的缓存机制 1.1 缓存介绍 1.缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的 ...
- Django 2.0 学习(18):Django 缓存、信号和extra
Django 缓存.信号和extra Django 缓存 由于Django是动态网站,所以每次请求均会去数据库进行相应的操作,当程序访问量大时,耗时必然会显著增加.最简单的解决方法是:使用缓存,缓存将 ...
- Django缓存,信号,序列化
缓存 1.缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次的的后台操作 ...
- Django 分页器 缓存 信号 序列化
阅读目录 分页器 缓存 信号 序列化 Django分页器 (paginator) 导入 from django.core.paginator import Paginator, EmptyPage, ...
- Django之信号和序列化
前言 Django的信号要从一张抽象图和一个需求说起: 赛道:Django 赛车:http请求 基础设施:Django设置的信号 一.Django内置信号类型 1.既然赛道上有各种基础设置,那么Dja ...
- Django缓存使用方法
Django缓存分为Session和Cookie:Session为放在服务器端的缓存:Cookie为放在客户端(浏览器)的缓存. Session一般用来保存登录会话:Cookie一般用来保存一些个性化 ...
- Django 缓存系统
Django 是动态网站,一般来说需要实时地生成访问的网页,展示给访问者,这样,内容可以随时变化,但是从数据库读多次把所需要的数据取出来,要比从内存或者硬盘等一次读出来 付出的成本大很多. 缓存系统工 ...
随机推荐
- 以__name__进行单元测试
# -*- coding: utf-8 -*- #python 27 #xiaodeng #以__name__进行单元测试 #何为单元测试? #单元测试(模块测试)是开发者编写的一小段代码,用于检测被 ...
- 在linux下安装并使用websocket
前言 首先,对websocket要有一个简要的了解与认识 websocket是HTML5开始提供的一种浏览器与服务器进行全双工通讯的网络技术,属于应用层协议. 它基于TCP传输协议,并复用HTTP的握 ...
- JavaScript和JQuery中的事件\委托链\事件冒泡\事件捕获,兼容所有浏览器
有做过北大青鸟培训讲师经验的我,如今在一家公司做技术部经理的职位,发现有很多程序员的基本功相当糟糕,在组织企业内部培训时讲解了一些案例,总结了一些经典代码,希望对自己和有需要的人提供一些帮助吧: Ja ...
- 存储映射I/O
一个进程拥有独立并且连续虚拟地址空间,在32位体系结构中进程的地址空间是4G.不过,内核在管理进程的地址空间时是以内存区域为单位.内存区域是进程整个地址空间中一个独立的内存范围,它在内核中使用vm_a ...
- Java 异常模型综述
一. 异常的引入及基础 发现错误的理想时机是在编译阶段.也就是在你试图运行程序之前. 然而,编译期间编译器并不能找出全部的错误,余下的错误仅仅有在运行期才干发现和解决,这类错误就是 Throwable ...
- MPU6050读取FIFI数据时mpu_dmp_get_data的返回值一直是1
试验中发现:不断进行循环读fiffo就可以得到正常数据.形如这样 );//返回值:0,DMP成功解出欧拉角 printf("pitch=%f\troll=%f\tyaw=%f\r\n&quo ...
- python标准库介绍——14 gc 模块详解
==gc 模块== (可选, 2.0 及以后版本) ``gc`` 模块提供了到内建循环垃圾收集器的接口. Python 使用引用记数来跟踪什么时候销毁一个对象; 一个对象的最后一个引用一旦消失, 这个 ...
- appium +uiautomator2 遇到 deviceName can't be blank 提示的解决
为了获取android toast ,需要升级selenium 到 3.4.0 和appium 5.0.0-BETA9 到最新版本,并在启动代码前面追加一行代码: capabilities.setCa ...
- Leaf——美团点评分布式ID生成系统
背景 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识.如在美团点评的金融.支付.餐饮.酒店.猫眼电影等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数 ...
- UVA 10972 - RevolC FaeLoN(边-双连通分量)
UVA 10972 - RevolC FaeLoN option=com_onlinejudge&Itemid=8&page=show_problem&category=547 ...