详解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 数据加密代码
Dec 24 Python
python3 模拟登录v2ex实例讲解
Jul 13 Python
Django实现分页功能
Jul 02 Python
matplotlib调整子图间距,调整整体空白的方法
Aug 03 Python
Python转换时间的图文方法
Jul 01 Python
Pycharm 字体大小调整设置的方法实现
Sep 27 Python
Python hashlib模块加密过程解析
Nov 05 Python
python-OpenCV 实现将数组转换成灰度图和彩图
Jan 09 Python
浅谈Python3实现两个矩形的交并比(IoU)
Jan 18 Python
tensorflow 实现自定义梯度反向传播代码
Feb 10 Python
python中四舍五入的正确打开方式
Jan 18 Python
python中pandas.read_csv()函数的深入讲解
Mar 29 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实现深度优先搜索算法(DFS,Depth First Search)详解
2017/09/16 PHP
Laravel 在views中加载公共页面的实现代码
2019/10/22 PHP
JavaScript使用prototype定义对象类型(转)[
2006/12/22 Javascript
jquery cookie插件代码类
2009/05/26 Javascript
javascript 使td内容不换行不撑开
2012/11/29 Javascript
使用indexOf等在JavaScript的数组中进行元素查找和替换
2013/09/18 Javascript
jquery如何把数组变为字符串传到服务端并处理
2014/04/30 Javascript
jquery实现的用户注册表单提示操作效果代码分享
2015/08/28 Javascript
谈谈基于iframe、FormData、FileReader三种无刷新上传文件的方法
2015/12/03 Javascript
关于cookie的初识和运用(js和jq)
2016/04/07 Javascript
浅析JavaScript中的对象类型Object
2016/05/26 Javascript
AngularJS内建服务$location及其功能详解
2016/07/01 Javascript
JavaScript 函数模式详解及示例
2016/09/07 Javascript
Vue.js实现微信过渡动画左右切换效果
2017/06/13 Javascript
深入理解Webpack 中路径的配置
2017/06/17 Javascript
react-native组件中NavigatorIOS和ListView结合使用的方法
2017/09/30 Javascript
vue.js2.0 实现better-scroll的滚动效果实例详解
2018/08/13 Javascript
vue-router命名视图的使用讲解
2019/01/19 Javascript
python抓取网页中的图片示例
2014/02/28 Python
如何基于线程池提升request模块效率
2020/04/18 Python
Python爬虫实现HTTP网络请求多种实现方式
2020/06/19 Python
五分钟学会怎么用Pygame做一个简单的贪吃蛇
2021/01/06 Python
css3选择器基本介绍
2014/12/15 HTML / CSS
Bally巴利中国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/10/09 全球购物
中学生校园广播稿
2014/01/16 职场文书
艺术学院毕业生自荐信
2014/07/05 职场文书
2014机关干部学习“焦裕禄精神”思想汇报
2014/09/19 职场文书
党的群众路线教育实践活动对照检查材料(四风)
2014/09/27 职场文书
孝老爱亲事迹材料
2014/12/24 职场文书
常务副总经理岗位职责
2015/02/02 职场文书
董事长助理岗位职责
2015/02/11 职场文书
2015年文员个人工作总结
2015/04/09 职场文书
学校食堂食品安全承诺书
2015/04/29 职场文书
2015年党建工作目标责任书
2015/05/08 职场文书
行政处罚决定书
2015/06/24 职场文书
2016年教师新年寄语
2015/08/18 职场文书