浅谈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利用OpenCV2实现人脸检测
Apr 16 Python
selenium+python实现自动登录脚本
Apr 22 Python
python2.7实现爬虫网页数据
May 25 Python
wtfPython—Python中一组有趣微妙的代码【收藏】
Aug 31 Python
python 在屏幕上逐字显示一行字的实例
Dec 24 Python
django 数据库连接模块解析及简单长连接改造方法
Aug 29 Python
python GUI库图形界面开发之PyQt5浏览器控件QWebEngineView详细使用方法
Feb 26 Python
pytorch判断是否cuda 判断变量类型方式
Jun 23 Python
Pytest如何使用skip跳过执行测试
Aug 13 Python
python将数据插入数据库的代码分享
Aug 16 Python
Django显示可视化图表的实践
May 10 Python
Python人工智能之混合高斯模型运动目标检测详解分析
Nov 07 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
php 将bmp图片转为jpg等其他任意格式的图片
2009/06/29 PHP
一键生成各种尺寸Icon的php脚本(实例)
2017/02/08 PHP
php进行md5加密简单实例方法
2019/09/19 PHP
用dom+xhtml+css制作的一个相册效果代码打包下载
2008/01/24 Javascript
百度留言本js 大家可以参考下
2009/10/13 Javascript
jquery $.getJSON()跨域请求
2011/12/21 Javascript
JavaScript通过正则表达式实现表单验证电话号码
2014/03/07 Javascript
javascript打开word文档的方法
2014/04/16 Javascript
JavaScript获取图片真实大小代码实例
2014/09/24 Javascript
基于jQuery+PHP+Mysql实现在线拍照和在线浏览照片
2015/09/06 Javascript
JavaScript中为事件指定处理程序的五种方式分析
2018/07/27 Javascript
Vue指令指令大全
2019/02/09 Javascript
深入解析vue 源码目录及构建过程分析
2019/04/24 Javascript
Vue Router history模式的配置方法及其原理
2019/05/30 Javascript
vue store之状态管理模式的详细介绍
2019/06/13 Javascript
Vue + Element UI图片上传控件使用详解
2019/08/20 Javascript
微信小程序组件生命周期的踩坑记录
2021/03/03 Javascript
[02:41]DOTA2英雄基础教程 亚巴顿
2014/01/02 DOTA
python之模拟鼠标键盘动作具体实现
2013/12/30 Python
python开发环境PyScripter中文乱码问题解决方案
2016/09/11 Python
老生常谈Python startswith()函数与endswith函数
2017/09/08 Python
pyftplib中文乱码问题解决方案
2020/01/11 Python
使用tensorboard可视化loss和acc的实例
2020/01/21 Python
Python文字截图识别OCR工具实例解析
2020/03/05 Python
django API 中接口的互相调用实例
2020/04/01 Python
python 已知三条边求三角形的角度案例
2020/04/12 Python
解决python中import文件夹下面py文件报错问题
2020/06/01 Python
师范生教师实习自我鉴定
2013/09/27 职场文书
美德好少年事迹材料
2014/01/19 职场文书
我的小天地教学反思
2014/04/30 职场文书
个人四风问题对照检查材料
2014/09/26 职场文书
医院党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
维稳工作承诺书
2015/01/20 职场文书
护士先进个人总结
2015/02/13 职场文书
外出学习心得体会范文
2016/01/18 职场文书
MySQL中的布尔值,怎么存储false或true
2021/06/04 MySQL