浅谈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和Ruby中each循环引用变量问题(一个隐秘BUG?)
Jun 04 Python
python生成tensorflow输入输出的图像格式的方法
Feb 12 Python
python文本数据相似度的度量
Mar 12 Python
对tensorflow 的模型保存和调用实例讲解
Jul 28 Python
python用plt画图时,cmp设置方法
Dec 13 Python
Python3利用print输出带颜色的彩色字体示例代码
Apr 08 Python
Python tkinter实现图片标注功能(完整代码)
Dec 08 Python
Python 实现自动获取种子磁力链接方式
Jan 16 Python
Pandas缺失值2种处理方式代码实例
Jun 13 Python
Tensorflow与Keras自适应使用显存方式
Jun 22 Python
使用python实现下载我们想听的歌曲,速度超快
Jul 09 Python
Python用tkinter实现自定义记事本的方法详解
Mar 31 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蜘蛛统计插件只要有mysql就可用
2010/10/12 PHP
用来解析.htgroup文件的PHP类
2012/09/05 PHP
JavaScipt基本教程之前言
2008/01/16 Javascript
AngularJS基础 ng-keypress 指令简单示例
2016/08/02 Javascript
浅谈Javascript中的12种DOM节点类型
2016/08/19 Javascript
相册展示PhotoSwipe.js插件实现
2016/08/25 Javascript
微信小程序 教程之模板
2016/10/18 Javascript
JS中substring与substr的用法
2016/11/16 Javascript
基于JQuery实现的跑马灯效果(文字无缝向上翻动)
2016/12/02 Javascript
JS正则表达式之非捕获分组用法实例分析
2016/12/28 Javascript
jquery将标签元素的高设为屏幕的百分比
2017/04/19 jQuery
vue单页应用加百度统计代码(亲测有效)
2018/01/31 Javascript
在JS循环中使用async/await的方法
2018/10/12 Javascript
写gulp遇到的ES6问题详解
2018/12/03 Javascript
vuejs数据超出单行显示更多,点击展开剩余数据实例
2019/05/05 Javascript
vue.js表单验证插件(vee-validate)的使用教程详解
2019/05/23 Javascript
一文读懂vue动态属性数据绑定(v-bind指令)
2020/07/20 Javascript
Vue页面跳转传递参数及接收方式
2020/09/09 Javascript
在IPython中执行Python程序文件的示例
2018/11/01 Python
Python搭建代理IP池实现存储IP的方法
2019/10/27 Python
python两个_多个字典合并相加的实例代码
2019/12/26 Python
Pytorch实现各种2d卷积示例
2019/12/30 Python
python实现飞机大战项目
2020/03/11 Python
Python基于wordcloud及jieba实现中国地图词云图
2020/06/09 Python
python 抓取知乎指定回答下视频的方法
2020/07/09 Python
记一次python 爬虫爬取深圳租房信息的过程及遇到的问题
2020/11/24 Python
HTML5安全介绍之内容安全策略(CSP)简介
2012/07/10 HTML / CSS
全球领先的鞋类零售商:The Walking Company
2016/07/21 全球购物
递归实现回文判断(如:abcdedbca就是回文,判断一个面试者对递归理解的简单程序)
2013/04/28 面试题
终端业务员岗位职责
2013/11/27 职场文书
国际商务专业职业生涯规划书范文
2014/01/17 职场文书
解除劳动合同协议书范本
2014/04/14 职场文书
行政诉讼答辩状
2015/05/21 职场文书
优秀教师主要事迹材料
2015/11/04 职场文书
《珍珠鸟》教学反思
2016/02/16 职场文书
如何判断pytorch是否支持GPU加速
2021/06/01 Python