详解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 中的 else详解
Apr 23 Python
Python把对应格式的csv文件转换成字典类型存储脚本的方法
Feb 12 Python
python实现电子产品商店
Feb 26 Python
Python 中的参数传递、返回值、浅拷贝、深拷贝
Jun 25 Python
使用python写的opencv实时监测和解析二维码和条形码
Aug 14 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
Sep 18 Python
python如何实现单链表的反转
Feb 10 Python
python的sys.path模块路径添加方式
Mar 09 Python
Python AutoCAD 系统设置的实现方法
Apr 01 Python
python中sklearn的pipeline模块实例详解
May 21 Python
深入了解Python装饰器的高级用法
Aug 13 Python
一行Python命令实现批量加水印
Apr 07 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
十大“创意”战术!
2020/03/04 星际争霸
php4与php5的区别小结(配置异同)
2011/12/20 PHP
使用一个for循环将N*N的二维数组的所有值置1实现方法
2017/05/29 PHP
Yii框架自定义数据库操作组件示例
2019/11/11 PHP
28个JS验证函数收集
2010/03/02 Javascript
javascript 判断数组是否已包含了某个元素的函数
2010/05/30 Javascript
javascript数组去重3种方法的性能测试与比较
2013/03/26 Javascript
jQuery阻止事件冒泡具体实现
2013/10/11 Javascript
jQuery使用hide方法隐藏指定元素class样式用法实例
2015/03/30 Javascript
JS在Chrome浏览器中showModalDialog函数返回值为undefined的解决方法
2016/08/03 Javascript
JS匿名函数实例分析
2016/11/26 Javascript
利用JS做网页特效_大图轮播(实例讲解)
2017/08/09 Javascript
JavaScript requestAnimationFrame动画详解
2017/09/14 Javascript
微信小程序 scroll-view实现锚点滑动的示例
2017/12/06 Javascript
JavaScrip关于创建常量的知识点
2017/12/07 Javascript
JavaScript常用截取字符串的三种方式用法区别实例解析
2018/05/15 Javascript
详解Nodejs mongoose
2018/06/10 NodeJs
vue2.0$nextTick监听数据渲染完成之后的回调函数方法
2018/09/11 Javascript
JS实现移动端可折叠导航菜单(现代都市风)
2020/07/07 Javascript
python使用BeautifulSoup分析网页信息的方法
2015/04/04 Python
python机器学习之贝叶斯分类
2018/03/26 Python
Python实现求一个集合所有子集的示例
2018/05/04 Python
python切片及sys.argv[]用法详解
2018/05/25 Python
Python当中的array数组对象实例详解
2019/06/12 Python
python3+PyQt5 数据库编程--增删改实例
2019/06/17 Python
详解mac python+selenium+Chrome 简单案例
2019/11/08 Python
Python partial函数原理及用法解析
2019/12/11 Python
蒂娜商店:Tiina the Store
2019/12/07 全球购物
送给程序员的20个Java集合面试问题
2014/08/06 面试题
诚信考试承诺书
2014/03/27 职场文书
竞争上岗演讲稿范文
2014/05/12 职场文书
医疗专业毕业生求职信
2014/08/28 职场文书
小学教师自我剖析材料
2014/09/29 职场文书
三年级学生评语大全
2014/12/26 职场文书
安装Windows Server 2012 R2企业版操作系统并设置好相关参数
2022/04/29 Servers
教你win10系统中APPCRASH事件问题解决方法
2022/07/15 数码科技