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. 树链剖分&咕咕咕了好久好久的qtree3

    前言 显然qtree系列都是树链剖分辣 发现自己没有专门整理过树链剖分耶 辣么就把这篇博客魔改成树链剖分好辣(貌似除了树剖也没什么好写的) 正文 废话了辣么多终于开始了 一.树剖怎么写鸭 二.树剖有什 ...

  2. 1、maven的下载,安装,配置

    下载 1.maven官方下载地址: http://maven.apache.org/download.cgi 进入官网: 下载各历史版本官方地址: https://archive.apache.org ...

  3. Django学习之缓存

    1.配置 2.应用 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存.缓存将一个某个views的返回值保存至内存或者m ...

  4. 开发-日常工具:TFS(Team Foundation Server)

    ylbtech-开发-日常工具:TFS(Team Foundation Server) TFS(Team Foundation Server)是一个高可扩展.高可用.高性能.面向互联网服务的分布式文件 ...

  5. Windows环境下Mysql 5.7读写分离简单记录

    一.目的 本文记录了在Windows环境中,mysql数据库读写分离配置过程. 二.准备: Master机器:Windows 10 虚拟机,IP:192.168.3.32 Slave机器:Window ...

  6. hibernate+spring mvc,解决hibernate对象懒加载,json序列化失败

    在使用spring MVC时,@ResponseBody 注解的方法返回一个有懒加载对象的时候出现了异常,以登录为例: @RequestMapping("login") @Resp ...

  7. Linux 命令 - man 查看命令的文档

    man 命令是 Linux 中最常用的命令,碰到任何让你疑惑的命令,都可以 man 一下来查看详情.不只是 shell 命令,C 语言库函数和系统调用等内容也可以通过 man 命令查看. man 命令 ...

  8. flask-profiler, 监视端点调用并尝试进行某些分析的Flask 事件探查器

    源代码名称:flask-profiler 源代码网址:http://www.github.com/muatik/flask-profiler flask-profiler源代码文档 flask-pro ...

  9. HTML5——添加新元素 新元素 Canvas SVG MathML 黑客帝国特效

    为HTML添加新元素 添加新元素   +   该元素定义样式 <!DOCTYPE html> <html> <head> <meta charset=&quo ...

  10. python接口自动化:requests+ddt+htmltestrunner数据驱动框架

    该框架分为四个包:xc_datas.xc_driven.xc_report.xc_tools. xc_datas:存放数据,xc_driven:存放执行程序,xc_report:存放生成的报告,xc_ ...