详解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访问纯真IP数据库的代码
May 19 Python
Django的HttpRequest和HttpResponse对象详解
Jan 26 Python
用pandas中的DataFrame时选取行或列的方法
Jul 11 Python
python实现屏保计时器的示例代码
Aug 08 Python
使用Python机器学习降低静态日志噪声
Sep 29 Python
python树莓派红外反射传感器
Jan 21 Python
浅谈python函数调用返回两个或多个变量的方法
Jan 23 Python
python实发邮件实例详解
Nov 11 Python
Python算法的时间复杂度和空间复杂度(实例解析)
Nov 19 Python
Pycharm 2020.1 版配置优化的详细教程
Aug 07 Python
Pytorch 图像变换函数集合小结
Feb 01 Python
python中Pyqt5使用Qlabel标签播放视频
Apr 22 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添加xml文档内容的方法
2015/01/23 PHP
php实现将HTML页面转换成word并且保存的方法
2016/10/14 PHP
Mootools 1.2教程 定时器和哈希简介
2009/09/15 Javascript
js 返回时间戳所对应的具体时间
2010/07/20 Javascript
纯js分页代码(简洁实用)
2013/11/05 Javascript
jquery实现的鼠标拖动排序Li或Table
2014/05/04 Javascript
Jquery性能优化详解
2014/05/15 Javascript
用console.table()调试javascript
2014/09/04 Javascript
javascript实现在线客服效果
2015/07/15 Javascript
jQuery 弹出层插件(推荐)
2016/05/24 Javascript
javascript创建对象的3种方法
2016/11/02 Javascript
性能优化之代码优化页面加载速度
2017/03/01 Javascript
浅谈angular2 组件的生命周期钩子
2017/08/12 Javascript
微信小程序引用公共js里的方法的实例详解
2017/08/17 Javascript
vue项目中axios使用详解
2018/02/07 Javascript
electron实现qq快捷登录的方法示例
2018/10/22 Javascript
Javascript读写cookie的实例源码
2019/03/16 Javascript
layui表格内容溢出的解决方法
2019/09/06 Javascript
vue实现学生信息管理系统
2020/05/30 Javascript
vue制作toast组件npm包示例代码
2020/10/29 Javascript
Python translator使用实例
2008/09/06 Python
Pyhton中防止SQL注入的方法
2015/02/05 Python
用tensorflow构建线性回归模型的示例代码
2018/03/05 Python
Python 利用scrapy爬虫通过短短50行代码下载整站短视频
2018/10/29 Python
matplotlib实现显示伪彩色图像及色度条
2019/12/07 Python
python数据爬下来保存的位置
2020/02/17 Python
Python基础之字符串常见操作经典实例详解
2020/02/26 Python
HTML5使用ApplicationCache接口实现离线缓存技术解决离线难题
2012/12/13 HTML / CSS
英国No.1体育用品零售商:SportsDirect.com
2019/10/16 全球购物
财务部出纳岗位职责
2013/12/22 职场文书
公司庆典邀请函范文
2014/01/13 职场文书
理工大学毕业生自荐信范文
2014/02/22 职场文书
通信工程求职信
2014/07/16 职场文书
党员检讨书范文
2014/12/27 职场文书
大三学生英语考试作弊检讨书
2015/01/01 职场文书
2016元旦文艺汇演主持词
2015/07/06 职场文书