浅谈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中使用PIL库实现图片高斯模糊实例
Feb 08 Python
Python处理json字符串转化为字典的简单实现
Jul 07 Python
Python的requests网络编程包使用教程
Jul 11 Python
使用Python3 编写简单信用卡管理程序
Dec 21 Python
python itchat实现微信自动回复的示例代码
Aug 14 Python
解决Python字典写入文件出行首行有空格的问题
Sep 27 Python
Python科学画图代码分享
Nov 29 Python
Python cookbook(数据结构与算法)将序列分解为单独变量的方法
Feb 13 Python
Python 存储字符串时节省空间的方法
Apr 23 Python
python3中使用__slots__限定实例属性操作分析
Feb 14 Python
python 批量下载bilibili视频的gui程序
Nov 20 Python
Python基本数据类型之字符串str
Jul 21 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中的正规表达式(一)
2006/10/09 PHP
PHP防止post重复提交数据的简单例子
2014/06/07 PHP
php对包含html标签的字符串进行截取的函数分享
2014/06/19 PHP
php线性表的入栈与出栈实例分析
2015/06/12 PHP
PHP实现的购物车类实例
2015/06/17 PHP
PHP和C#可共用的可逆加密算法详解
2015/10/26 PHP
高质量PHP代码的50个实用技巧必备(下)
2016/01/22 PHP
PHP后台微信支付和支付宝支付开发
2017/04/28 PHP
JavaScript 在线压缩和格式化收藏
2009/01/16 Javascript
简单实用的全选反选按钮例子
2013/10/18 Javascript
JS实现侧悬浮浮动实例代码
2013/11/29 Javascript
Jqgrid设置全选(选择)及获取选择行的值示例代码
2013/12/28 Javascript
jQuery实现的placeholder效果完整实例
2016/08/02 Javascript
JS二叉树的简单实现方法示例
2017/04/05 Javascript
详解ES6新增字符串扩张方法includes()、startsWith()、endsWith()
2020/05/12 Javascript
JavaScript中条件语句的优化技巧总结
2020/12/04 Javascript
vue实现简易计算器功能
2021/01/20 Vue.js
[40:27]完美世界DOTA2联赛PWL S3 PXG vs GXR 第一场 12.19
2020/12/24 DOTA
Linux 发邮件磁盘空间监控(python)
2016/04/23 Python
python pandas库中DataFrame对行和列的操作实例讲解
2018/06/09 Python
pycharm的console输入实现换行的方法
2019/01/16 Python
使用PIL(Python-Imaging)反转图像的颜色方法
2019/01/24 Python
Python常用的json标准库
2019/02/19 Python
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
2020/04/20 Python
Python使用多进程运行含有任意个参数的函数
2020/05/02 Python
python能否java成为主流语言吗
2020/06/22 Python
加拿大最大的体育用品、鞋类和服装零售商:Sport Chek
2018/11/29 全球购物
美国唇部护理专家:Sara Happ
2019/06/19 全球购物
联想印度官方网上商店:Lenovo India
2019/08/24 全球购物
教师评优的个人自我评价分享
2013/09/19 职场文书
理工类毕业自我鉴定
2014/02/20 职场文书
实习协议书范本
2014/04/22 职场文书
主题党日活动总结
2014/07/08 职场文书
毕业实习自我鉴定范文2014
2014/09/26 职场文书
预备党员的思想汇报,你真的会写吗?
2019/06/28 职场文书
JavaScript 事件捕获冒泡与捕获详情
2021/11/11 Javascript