浅谈Python的Django框架中的缓存控制


Posted in Python onJuly 24, 2015

关于缓存剩下的问题是数据的隐私性以及在级联缓存中数据应该在何处储存的问题。

通常用户将会面对两种缓存: 他或她自己的浏览器缓存(私有缓存)以及他或她的提供者缓存(公共缓存)。 公共缓存由多个用户使用,而受其他某人的控制。 这就产生了你不想遇到的敏感数据的问题,比如说你的银行账号被存储在公众缓存中。 因此,Web 应用程序需要以某种方式告诉缓存那些数据是私有的,哪些是公共的。

解决方案是标示出某个页面缓存应当是私有的。 要在 Django 中完成此项工作,可使用 cache_control 视图修饰器: 例如:

from django.views.decorators.cache import cache_control

@cache_control(private=True)
def my_view(request):
  # ...

该修饰器负责在后台发送相应的 HTTP 头部。

还有一些其他方法可以控制缓存参数。 例如, HTTP 允许应用程序执行如下操作:

  •     定义页面可以被缓存的最大时间。
  •     指定某个缓存是否总是检查较新版本,仅当无更新时才传递所缓存内容。 (一些缓存即便在服务器页面发生变化的情况下仍然会传送所缓存的内容,只因为缓存拷贝没有过期。)

在 Django 中,可使用 cache_control 视图修饰器指定这些缓存参数。 在本例中, cache_control 告诉缓存对每次访问都重新验证缓存并在最长 3600 秒内保存所缓存版本:

from django.views.decorators.cache import cache_control

@cache_control(must_revalidate=True, max_age=3600)
def my_view(request):
  # ...

在 cache_control() 中,任何合法的Cache-Control HTTP 指令都是有效的。下面是完整列表:

public=True

  private=True

  no_cache=True

  no_transform=True

  must_revalidate=True

  proxy_revalidate=True

  max_age=num_seconds

  s_maxage=num_seconds

缓存中间件已经使用 CACHE_MIDDLEWARE_SETTINGS 设置设定了缓存头部 max-age 。 如果你在cache_control修饰器中使用了自定义的max_age,该修饰器将会取得优先权,该头部的值将被正确地被合并。

如果你想用头部完全禁掉缓存,django.views.decorators.cache.never_cache装饰器可以添加确保响应不被缓存的头部信息。 例如:

from django.views.decorators.cache import never_cache

@never_cache
def myview(request):
  # ...

其他优化

Django 带有一些其它中间件可帮助您优化应用程序的性能:

  •     django.middleware.http.ConditionalGetMiddleware 为现代浏览器增加了有条件的,基于 ETag 和 Last-Modified 头标的GET响应的相关支持。
  •     django.middleware.gzip.GZipMiddleware 为所有现代浏览器压缩响应内容,以节省带宽和传送时间。

MIDDLEWARE_CLASSES 的顺序

如果使用缓存中间件,注意在MIDDLEWARE_CLASSES设置中正确配置。 因为缓存中间件需要知道哪些头部信息由哪些缓存区来区分。 中间件总是尽可能得想Vary响应头中添加信息。

UpdateCacheMiddleware在相应阶段运行。因为中间件是以相反顺序运行的,所有列表顶部的中间件反而last在相应阶段的最后运行。 所有,你需要确保UpdateCacheMiddleware排在任何可能往Vary头部添加信息的中间件之前。 下面的中间件模块就是这样的:

  •     添加 Cookie 的 SessionMiddleware
  •     添加 Accept-Encoding 的 GZipMiddleware
  •     添加Accept-Language的LocaleMiddleware

另一方面,FetchFromCacheMiddleware在请求阶段运行,这时中间件循序执行,所以列表顶端的项目会首先执行。 FetchFromCacheMiddleware也需要在会修改Vary头部的中间件之后运行,所以FetchFromCacheMiddleware必须放在它们后面。

Python 相关文章推荐
python数据结构之二叉树的建立实例
Apr 29 Python
Python实现拼接多张图片的方法
Dec 01 Python
讲解Python中运算符使用时的优先级
May 14 Python
老生常谈Python进阶之装饰器
May 11 Python
Python实现的微信公众号群发图片与文本消息功能实例详解
Jun 30 Python
用python制作游戏外挂
Jan 04 Python
python3.6 实现AES加密的示例(pyCryptodome)
Jan 10 Python
python 判断网络连通的实现方法
Apr 22 Python
python库lxml在linux和WIN系统下的安装
Jun 24 Python
Python获取统计自己的qq群成员信息的方法
Nov 15 Python
解决tensorflow添加ptb库的问题
Feb 10 Python
PyQt5如何将.ui文件转换为.py文件的实例代码
May 26 Python
详解Django缓存处理中Vary头部的使用
Jul 24 #Python
解读Django框架中的低层次缓存API
Jul 24 #Python
Python的Django框架中模板碎片缓存简介
Jul 24 #Python
Django框架下在URLconf中指定视图缓存的方法
Jul 23 #Python
详解Django框架中的视图级缓存
Jul 23 #Python
Django中的CACHE_BACKEND参数和站点级Cache设置
Jul 23 #Python
简介Django框架中可使用的各类缓存
Jul 23 #Python
You might like
教你如何把一篇文章按要求分段
2006/10/09 PHP
PHP删除特定数组内容并且重建数组索引的方法.
2011/03/25 PHP
基于Snoopy的PHP近似完美获取网站编码的代码
2011/10/23 PHP
解析PHP计算页面执行时间的实现代码
2013/06/18 PHP
php查看网页源代码的方法
2015/03/13 PHP
phpinfo() 中 Local Value(局部变量)Master Value(主变量) 的区别
2016/02/03 PHP
php入门教程之Zend Studio设置与开发实例
2016/09/09 PHP
使用 PHP Masked Package 屏蔽敏感数据的实现方法
2019/10/15 PHP
PHPExcel实现的读取多工作表操作示例
2020/04/14 PHP
Javascript 布尔型分析
2008/12/22 Javascript
Jquery 基础学习笔记
2009/05/29 Javascript
js下关于onmouseout、事件冒泡的问题经验小结
2010/12/09 Javascript
JS控制阿拉伯数字转为中文大写示例代码
2013/09/04 Javascript
jquery中添加属性和删除属性
2015/06/03 Javascript
jQuery配合coin-slider插件制作幻灯片效果的流程解析
2016/05/13 Javascript
全面了解JavaScript的数据类型转换
2016/07/01 Javascript
jQuery解析与处理服务器端返回xml格式数据的方法详解
2016/07/04 Javascript
JS+HTML5实现上传图片预览效果完整实例【测试可用】
2017/04/20 Javascript
使用SVG基本操作API的实例讲解
2017/09/14 Javascript
Vue完整项目构建(进阶篇)
2018/02/10 Javascript
轻松搞定jQuery+JSONP跨域请求的解决方案
2018/03/06 jQuery
详解mpvue scroll-view自动回弹bug解决方案
2018/10/01 Javascript
angularjs请求数据的方法示例
2019/08/06 Javascript
JavaScript forEach中return失效问题解决方案
2020/06/01 Javascript
详解Python pygame安装过程笔记
2017/06/05 Python
基于python中的TCP及UDP(详解)
2017/11/06 Python
Python if语句知识点用法总结
2018/06/10 Python
对python3中pathlib库的Path类的使用详解
2018/10/14 Python
用Python将Excel数据导入到SQL Server的例子
2019/08/24 Python
在python shell中运行python文件的实现
2019/12/21 Python
使用Keras建立模型并训练等一系列操作方式
2020/07/02 Python
Pycharm自带Git实现版本管理的方法步骤
2020/09/18 Python
Opencv+Python识别PCB板图片的步骤
2021/01/07 Python
matplotlib交互式数据光标实现(mplcursors)
2021/01/13 Python
编程实现当输入某产品代码则打印出该产品记录的功能
2014/05/03 面试题
Filebeat 采集 Nginx 日志的方法
2021/03/31 Servers