浅谈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 相关文章推荐
在Django框架中设置语言偏好的教程
Jul 27 Python
Python3字符串学习教程
Aug 20 Python
Python给你的头像加上圣诞帽
Jan 04 Python
通过python顺序修改文件名字的方法
Jul 11 Python
使用Selenium破解新浪微博的四宫格验证码
Oct 19 Python
Python3实现的旋转矩阵图像算法示例
Apr 03 Python
python中单下划线(_)和双下划线(__)的特殊用法
Aug 29 Python
python将print输出的信息保留到日志文件中
Sep 27 Python
python不相等的两个字符串的 if 条件判断为True详解
Mar 12 Python
python语言的优势是什么
Jun 17 Python
详解pandas赋值失败问题解决
Nov 29 Python
解决tensorflow模型压缩的问题_踩坑无数,总算搞定
Mar 02 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 购物车的例子
2009/05/04 PHP
PHP stristr() 函数(不区分大小写的字符串查找)
2010/06/03 PHP
ThinkPHP3.1新特性之G方法的使用
2014/06/19 PHP
PHP实现通用alert函数的方法
2015/03/11 PHP
CodeIgniter 完美解决URL含有中文字符串
2016/05/13 PHP
php中bind_param()函数用法分析
2017/03/28 PHP
php检测mysql表是否存在的方法小结
2017/07/20 PHP
Yii框架使用PHPExcel导出Excel文件的方法分析【改进版】
2019/07/24 PHP
JQuery 学习笔记 element属性控制
2009/07/23 Javascript
js 延迟加载 改变JS的位置加快网页加载速度
2012/12/11 Javascript
js实现俄罗斯方块小游戏分享
2014/01/31 Javascript
Javascript 完美运动框架(逐行分析代码,让你轻松了运动的原理)
2015/01/23 Javascript
浅谈setTimeout 与 setInterval
2015/06/23 Javascript
简单实现轮播图效果的实例
2016/07/15 Javascript
Web 开发中Ajax的Session 超时处理方法
2017/01/19 Javascript
JavaScript实现短信倒计时60s
2017/10/09 Javascript
Vue.js获取手机系统型号、版本、浏览器类型的示例代码
2020/05/10 Javascript
[44:50]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第二局
2016/02/26 DOTA
Python列表list排列组合操作示例
2018/12/18 Python
使用python分析统计自己微信朋友的信息
2019/07/19 Python
Python Lambda函数使用总结详解
2019/12/11 Python
python+OpenCV实现图像拼接
2020/03/05 Python
pandas apply使用多列计算生成新的列实现示例
2021/02/24 Python
css3加js做一个简单的3D行星运转效果实例代码
2017/01/18 HTML / CSS
使用iframe+postMessage实现页面跨域通信的示例代码
2020/01/14 HTML / CSS
俄罗斯名牌服装网上商店:UNIQUE FABRIC
2019/07/25 全球购物
文言文形式的学生求职信
2013/12/03 职场文书
体育教师求职信
2014/06/30 职场文书
宣传标语大全
2014/07/01 职场文书
应用心理学专业求职信
2014/08/04 职场文书
单位委托书怎么写
2014/09/21 职场文书
寒假安全保证书
2015/02/28 职场文书
2015年社区计生工作总结
2015/04/21 职场文书
2015年幼儿园国庆节活动总结
2015/07/30 职场文书
30岁前绝不能错过的10本书
2019/08/08 职场文书
MySQL创建管理LIST分区
2022/04/13 MySQL