Django 之缓存

一、缓存

由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到,并返回。

Django中提供了6种缓存方式:

  • 开发调试
  • 内存
  • 文件
  • 数据库
  • Memcache缓存(python-memcached模块)
  • Memcache缓存(pylibmc模块)

1、配置

a、开发调试

1 # 此为开始调试用,实际内部不做任何操作
2 # 配置:
3 CACHES = {
4 'default': {
5 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', # 引擎
6 'TIMEOUT': 300, # 缓存超时时间(默认300,None表示永不过期,0表示立即过期)
7 'OPTIONS':{
8 'MAX_ENTRIES': 300, # 最大缓存个数(默认300)
9 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
10 },
11 'KEY_PREFIX': '', # 缓存key的前缀(默认空)
12 'VERSION': 1, # 缓存key的版本(默认1)
13 'KEY_FUNCTION' 函数名 # 生成key的函数(默认函数会生成为:【前缀:版本:key】)
14 }
15 }
16
17
18 # 自定义key
19 def default_key_func(key, key_prefix, version):
20 """
21 Default function to generate keys.
22
23 Constructs the key used by all other methods. By default it prepends
24 the `key_prefix'. KEY_FUNCTION can be used to specify an alternate
25 function with custom key making behavior.
26 """
27 return '%s:%s:%s' % (key_prefix, version, key)
28
29 def get_key_func(key_func):
30 """
31 Function to decide which key function to use.
32
33 Defaults to ``default_key_func``.
34 """
35 if key_func is not None:
36 if callable(key_func):
37 return key_func
38 else:
39 return import_string(key_func)
40 return default_key_func

b、内存

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

c、文件

1 # 此缓存将内容保存至文件
2 # 配置:
3
4 CACHES = {
5 'default': {
6 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
7 'LOCATION': '/var/tmp/django_cache',
8 }
9 }
10 # 注:其他配置同开发调试版本

d、数据库

 1 # 此缓存将内容保存至数据库
2
3 # 配置:
4 CACHES = {
5 'default': {
6 'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
7 'LOCATION': 'my_cache_table', # 数据库表
8 }
9 }
10
11 # 注:执行创建表命令 python manage.py createcachetable

e、Memcache缓存(python-memcached模块)

1 # 此缓存使用python-memcached模块连接memcache
2
3 CACHES = {
4 'default': {
5 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
6 'LOCATION': '127.0.0.1:11211',
7 }
8 }
9
10 CACHES = {
11 'default': {
12 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
13 'LOCATION': 'unix:/tmp/memcached.sock',
14 }
15 }
16
17 CACHES = {
18 'default': {
19 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
20 'LOCATION': [
21 '172.19.26.240:11211',
22 '172.19.26.242:11211',
23 ]
24 }
25 }

f、Memcache缓存(pylibmc模块)

1 # 此缓存使用pylibmc模块连接memcache
2
3 CACHES = {
4 'default': {
5 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
6 'LOCATION': '127.0.0.1:11211',
7 }
8 }
9
10 CACHES = {
11 'default': {
12 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
13 'LOCATION': '/tmp/memcached.sock',
14 }
15 }
16
17 CACHES = {
18 'default': {
19 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
20 'LOCATION': [
21 '172.19.26.240:11211',
22 '172.19.26.242:11211',
23 ]
24 }
25 }

2、应用

@cache_page(15) #超时时间为15秒,这15秒是暂存的状态,当过了15秒又是新状态了

a. 全站使用

1 使用中间件,经过一系列的认证等操作,如果内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户,当返回给用户之前,判断缓存中是否已经存在,如果不存在则UpdateCacheMiddleware会将缓存保存至缓存,从而实现全站缓存
2
3 MIDDLEWARE = [
4 'django.middleware.cache.UpdateCacheMiddleware',
5 # 其他中间件...
6 'django.middleware.cache.FetchFromCacheMiddleware',
7 ]
8
9 CACHE_MIDDLEWARE_ALIAS = ""
10 CACHE_MIDDLEWARE_SECONDS = ""
11 CACHE_MIDDLEWARE_KEY_PREFIX = ""

b. 单独视图缓存

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

c、局部视图使用

1 a. 引入TemplateTag
2
3 {% load cache %}
4
5 b. 使用缓存
6
7 {% cache 5000 缓存key %}
8 缓存内容
9 {% endcache %}

更多:猛击这里

Django【第18篇】:Django之缓存的更多相关文章

  1. Django框架第九篇--Django和Ajax、序列化组件(serializers)、自定义分页器、模型表choice参数

    Django和Ajax 一.什么是Ajax AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步的Javascript和XML”.即使用Javascript语 ...

  2. Django基础-04篇 Django开发前后端联动

    1. 写views views.py代码块 1.在前端以/article/{{ article.id }}这种方式请求后台, 参数配置在urls.py中path('category/<int:i ...

  3. Django 2.0 学习(18):Django 缓存、信号和extra

    Django 缓存.信号和extra Django 缓存 由于Django是动态网站,所以每次请求均会去数据库进行相应的操作,当程序访问量大时,耗时必然会显著增加.最简单的解决方法是:使用缓存,缓存将 ...

  4. Python之路【第十七篇】:Django【进阶篇 】

    Python之路[第十七篇]:Django[进阶篇 ]   Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...

  5. Python之路【第十六篇】:Django【基础篇】

    Python之路[第十六篇]:Django[基础篇]   Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了O ...

  6. Python之路【第十七篇】:Django【进阶篇】

    Python之路[第十七篇]:Django[进阶篇 ]   Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...

  7. Django【进阶篇 】

    Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行 ...

  8. Django【基础篇】

    Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...

  9. Python之Django【进阶篇 】

    Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行 ...

随机推荐

  1. leetcode206 反转链表 两种做法(循环,递归)

    反转链表 leetcode206 方法1 循环 public ListNode reverseList(ListNode head) { if (head == null || head.next = ...

  2. lgb参数及调参

    1 参数含义 max_depth: 设置树的最大深度,默认为-1,即不限制最大深度,它用于限制过拟合 num_leave: 单颗树的叶子数目,默认为31 eval_metric: 评价指标,可以用lg ...

  3. 打开Excel提示内存不足

    来越南出差第一天,有个越南妹子跟我反应说Excel打不开,提示的是很常见的“内存不足”的错误, 这种问题一般的判断就是打开的程序太多了,关掉一些就可以了,重启都没解决, 在网上找了下,腾讯管家的这篇h ...

  4. k8s集群上线web静态网站

    环境准备 一台部署节点,一台master节点,还有两台节点node1,node2 完好的k8s集群环境 思路1: 在node1和node2节点上通过宿主机与容器之间目录映射和端口映射上线静态网站(或动 ...

  5. 什么是Shell?Shell脚本基础知识详细介绍

    这篇文章主要介绍了什么是Shell?Shell脚本基础知识介绍,本文是一篇Shell脚本入门文章,在本文你可学到什么是Shell.有多少种Shell.一个Shell脚本代码实例,需要的朋友可以参考下 ...

  6. 【FICO系列】SAP FICO 凭证错误:BKPFF$PRDCLN800在FI中达到的项目最大编号

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[FICO系列]SAP FICO 凭证错误:BK ...

  7. springboot(3) 页面到服务器

    第一讲实现了spring boot 环境的下载及配置. 第二讲实现了,从服务器,到页面. 第三讲打算从页面到服务器. 比如,我们希望 从页面,点击一个按钮,传递信息到服务器. 就拿传递用户名和密码来简 ...

  8. Linux setup

    Install centos 7: Config Network a config example in /etc/sysconfig/network-scripts/ifcfg-ens160 TYP ...

  9. PIL实现图片框架以及生成图片验证码

    1. PIL的基本概念 PIL:即Python Imaging Library,是Python平台事实上的图像处理标准库. PIL中涉及通道(bands)和模式(mode)这两个重要概念. (1)通道 ...

  10. python每日一练:0014题

    第 0014 题: 纯文本文件 student.txt为学生信息, 里面的内容(包括花括号)如下所示: { "1":["张三",150,120,100], &q ...