浅谈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 过滤字符串的技巧,map与itertools.imap
Sep 06 Python
Python中为什么要用self探讨
Apr 14 Python
Python设计足球联赛赛程表程序的思路与简单实现示例
Jun 28 Python
python3获取两个日期之间所有日期,以及比较大小的实例
Apr 08 Python
对python 命令的-u参数详解
Dec 03 Python
Python使用while循环花式打印乘法表
Jan 28 Python
Python中文编码知识点
Feb 18 Python
python射线法判断检测点是否位于区域外接矩形内
Jun 28 Python
django的ORM操作 删除和编辑实现详解
Jul 24 Python
python利用dlib获取人脸的68个landmark
Nov 27 Python
如何通过安装HomeBrew来安装Python3
Dec 23 Python
Python基于mediainfo批量重命名图片文件
Dec 29 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
ThinkPHP公共配置文件与各自项目中配置文件组合的方法
2014/11/24 PHP
discuz论坛更换域名,详细文件修改步骤
2020/12/09 PHP
Javascript & DHTML 实例编程(教程)DOM基础和基本API
2007/06/02 Javascript
jquery模拟按下回车实现代码
2011/09/20 Javascript
js控制表单不能输入空格的小例子
2013/11/20 Javascript
javascript中的__defineGetter__和__defineSetter__介绍
2014/08/15 Javascript
原生js编写焦点图效果
2016/12/08 Javascript
JavaScript函数绑定用法实例分析
2017/11/14 Javascript
ES6/JavaScript使用技巧分享
2017/12/14 Javascript
Vue 进入/离开动画效果
2017/12/26 Javascript
nodejs实现的连接MySQL数据库功能示例
2018/01/25 NodeJs
解决angularJS中input标签的ng-change事件无效问题
2018/09/13 Javascript
NodeJS 将文件夹按照存放路径变成一个对应的JSON的方法
2018/10/17 NodeJs
微信小程序五子棋游戏的棋盘,重置,对弈实现方法【附demo源码下载】
2019/02/20 Javascript
vue+vant-UI框架实现购物车的复选框全选和反选功能
2019/11/05 Javascript
JavaScript实现滑动门效果
2020/01/18 Javascript
vue-router 路由传参用法实例分析
2020/03/06 Javascript
Vue 事件的$event参数=事件的值案例
2021/01/29 Vue.js
[01:44]《为梦想出发》—联想杯DOTA2完美世界全国高校联赛
2015/09/30 DOTA
[02:01]大师之路——DOTA2完美大师赛11月论剑上海
2017/11/06 DOTA
使用Python的Scrapy框架十分钟爬取美女图
2016/12/26 Python
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
2018/04/06 Python
python 常用的基础函数
2018/07/10 Python
Python实现的合并两个有序数组算法示例
2019/03/04 Python
python控制台实现tab补全和清屏的例子
2019/08/20 Python
django自定义模板标签过程解析
2019/12/14 Python
球队口号
2014/06/18 职场文书
学校标语大全
2014/06/19 职场文书
2015年办公室主任工作总结
2015/04/09 职场文书
2015年秋季灭鼠工作总结
2015/07/27 职场文书
2016年第二十五次全国助残日活动总结
2016/04/01 职场文书
Python爬虫进阶之Beautiful Soup库详解
2021/04/29 Python
Python使用海龟绘图实现贪吃蛇游戏
2021/06/18 Python
SpringDataJPA实体类关系映射配置方式
2021/12/06 Java/Android
Pycharm远程调试和MySQL数据库授权问题
2022/03/18 MySQL