详解Django缓存处理中Vary头部的使用


Posted in Python onJuly 24, 2015

Vary 头部定义了缓存机制在构建其缓存键值时应当将哪个请求头标考虑在内。 例如,如果网页的内容取决于用户的语言偏好,该页面被称为根据语言而不同。

缺省情况下,Django 的缓存系统使用所请求的路径(比如:"/stories/2005/jun/23/bank_robbed/" )来创建其缓存键。这意味着每次请求都会使用同样的缓存版本,不考虑才客户端cookie和语言配置的不同。 除非你使用Vary头部通知缓存机制页面输出要依据请求头里的cookie,语言等的设置而不同。

要在 Django 完成这项工作,可使用便利的 vary_on_headers 视图装饰器,如下所示:

from django.views.decorators.vary import vary_on_headers

# Python 2.3 syntax.
def my_view(request):
  # ...
my_view = vary_on_headers(my_view, 'User-Agent')

# Python 2.4+ decorator syntax.
@vary_on_headers('User-Agent')
def my_view(request):
  # ...

在这种情况下,缓存机制(如 Django 自己的缓存中间件)将会为每一个单独的用户浏览器缓存一个独立的页面版本。

使用 vary_on_headers 装饰器而不是手动设置 Vary 头部(使用像 response['Vary'] = 'user-agent' 之类的代码)的好处是修饰器在(可能已经存在的) Vary 之上进行 添加 ,而不是从零开始设置,且可能覆盖该处已经存在的设置。

你可以向 vary_on_headers() 传入多个头标:

@vary_on_headers('User-Agent', 'Cookie')
def my_view(request):
  # ...

该段代码通知上游缓存对 两者 都进行不同操作,也就是说 user-agent 和 cookie 的每种组合都应获取自己的缓存值。 举例来说,使用 Mozilla 作为 user-agent 而 foo=bar 作为 cookie 值的请求应该和使用 Mozilla 作为 user-agent 而 foo=ham 的请求应该被视为不同请求。

由于根据 cookie 而区分对待是很常见的情况,因此有 vary_on_cookie 装饰器。 以下两个视图是等效的:

@vary_on_cookie
def my_view(request):
  # ...

@vary_on_headers('Cookie')
def my_view(request):
  # ...

传入 vary_on_headers 头标是大小写不敏感的; "User-Agent" 与 "user-agent" 完全相同。

你也可以直接使用帮助函数:django.utils.cache.patch_vary_headers。 该函数设置或增加 Vary header ,例如:

from django.utils.cache import patch_vary_headers

def my_view(request):
  # ...
  response = render_to_response('template_name', context)
  patch_vary_headers(response, ['Cookie'])
  return response

patch_vary_headers 以一个 HttpResponse 实例为第一个参数,以一个大小写不敏感的头标名称列表或元组为第二个参数。

Python 相关文章推荐
用python代码做configure文件
Jul 20 Python
python实现装饰器、描述符
Feb 28 Python
python微信好友数据分析详解
Nov 19 Python
pyqt5实现登录界面的模板
May 30 Python
Python实现计算对象的内存大小示例
Jul 10 Python
Python qqbot 实现qq机器人的示例代码
Jul 11 Python
Python对接支付宝支付自实现功能
Oct 10 Python
Python线程指南分享
Nov 19 Python
pytorch 计算ConvTranspose1d输出特征大小方式
Jun 23 Python
python转化excel数字日期为标准日期操作
Jul 14 Python
Python实现壁纸下载与轮换
Oct 19 Python
Python实现位图分割的效果
Nov 20 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
浅析Python的Django框架中的Memcached
Jul 23 #Python
You might like
在PHP中养成7个面向对象的好习惯
2010/01/28 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(五)
2014/06/23 PHP
PHP调用MySQL存储过程并返回值的方法
2014/12/26 PHP
PHP直接修改表内容DataGrid功能实现代码
2015/09/24 PHP
php将一维数组转换为每3个连续值组成的二维数组
2016/05/06 PHP
php实现与python进行socket通信的方法示例
2017/08/30 PHP
php生成微信红包数组的方法
2019/09/05 PHP
jquery中实现标签切换效果的代码
2011/03/01 Javascript
javascript表单验证 - Parsley.js使用和配置
2013/01/25 Javascript
js中Image对象以及对其预加载处理示例
2013/11/20 Javascript
JavaScript插件化开发教程 (四)
2015/01/27 Javascript
EasyUI中combobox默认值注意事项
2015/03/01 Javascript
js实现仿Windows风格选项卡和按钮效果实例
2015/05/13 Javascript
JavaScript获取数组最小值和最大值的方法
2015/06/09 Javascript
JavaScript实现LI列表数据绑定的方法
2015/08/04 Javascript
js制作带有遮罩弹出层实现登录注册表单特效代码分享
2015/09/05 Javascript
nodejs和C语言插入mysql数据库乱码问题的解决方法
2017/04/14 NodeJs
详解vue嵌套路由-query传递参数
2017/05/23 Javascript
说说node中的可读流和可写流的区别
2018/06/01 Javascript
uni-app实现点赞评论功能
2019/11/25 Javascript
vscode调试node.js的实现方法
2020/03/22 Javascript
Vue自定义表单内容检查rules实例
2020/10/30 Javascript
[09:43]DOTA2每周TOP10 精彩击杀集锦vol.5
2014/06/25 DOTA
Python生成器(Generator)详解
2015/04/13 Python
Python使用BeautifulSoup库解析HTML基本使用教程
2016/03/31 Python
利用ctypes提高Python的执行速度
2016/09/09 Python
python爬虫项目设置一个中断重连的程序的实现
2019/07/26 Python
如何基于python生成list的所有的子集
2019/11/11 Python
Python timer定时器两种常用方法解析
2020/01/20 Python
python 通过邮件控制实现远程控制电脑操作
2020/03/16 Python
python爬取微博评论的实例讲解
2021/01/15 Python
CSS3制作苹果风格键盘特效
2015/02/26 HTML / CSS
TripAdvisor土耳其网站:全球知名旅行社区,真实旅客评论
2017/04/17 全球购物
南京某软件公司的.net面试题
2015/11/30 面试题
怎样客观的做好自我评价
2013/12/28 职场文书
外语系毕业生求职自荐信
2014/04/12 职场文书