详解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安装教程 Pycharm安装详细教程
May 02 Python
浅谈Python实现Apriori算法介绍
Dec 20 Python
详解python中的线程
Feb 10 Python
Python 批量合并多个txt文件的实例讲解
May 08 Python
pygame库实现俄罗斯方块小游戏
Oct 29 Python
Pyorch之numpy与torch之间相互转换方式
Dec 31 Python
找Python安装目录,设置环境路径以及在命令行运行python脚本实例
Mar 09 Python
Python连接Hadoop数据中遇到的各种坑(汇总)
Apr 14 Python
Python ArgumentParse的subparser用法说明
Apr 20 Python
python获取淘宝服务器时间的代码示例
Apr 22 Python
python如何进行基准测试
Apr 26 Python
Python绘制散乱的点构成的图的方法
Apr 21 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水印
2007/03/16 PHP
PHP中可以自动分割查询字符的Parse_str函数使用示例
2014/07/25 PHP
PHP中SSO Cookie登录分析和实现
2015/11/06 PHP
在WordPress中实现发送http请求的相关函数解析
2015/12/29 PHP
PHP书写格式详解(必看)
2016/05/23 PHP
基于php编程规范(详解)
2017/08/17 PHP
[IE&FireFox兼容]JS对select操作
2007/01/07 Javascript
jquery.boxy弹出框(后隔N秒后自动隐藏/自动跳转)
2013/01/15 Javascript
jquery实现图片放大镜功能
2015/11/23 Javascript
JavaScript实现打开链接页面的方式汇总
2016/06/02 Javascript
JS实现复制内容到剪贴板功能兼容所有浏览器(推荐)
2016/06/17 Javascript
浅谈Node.js:Buffer模块
2016/12/05 Javascript
整理一些最近经常遇到的前端面试题
2017/04/25 Javascript
Laravel整合Bootstrap 4的完整方案(推荐)
2018/01/25 Javascript
Vue项目分环境打包的实现步骤
2018/04/02 Javascript
详解Chart.js轻量级图表库的使用经验
2018/05/22 Javascript
bootstrap里bootstrap动态加载下拉框的实例讲解
2018/08/10 Javascript
JS实现把一个页面层数据传递到另一个页面的两种方式
2018/08/13 Javascript
Vue2.0点击切换类名改变样式的方法
2018/08/22 Javascript
vue打包使用Nginx代理解决跨域问题
2018/08/27 Javascript
webpack dll打包重复问题优化的解决
2018/10/10 Javascript
javascript实现文本框标签验证的实例代码
2018/10/14 Javascript
小程序点击图片实现png转jpg
2019/10/22 Javascript
基于javascript处理二进制图片流过程详解
2020/06/08 Javascript
如何在Vue项目中添加接口监听遮罩
2021/01/25 Vue.js
[40:17]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第一场
2018/04/06 DOTA
30分钟搭建Python的Flask框架并在上面编写第一个应用
2015/03/30 Python
python 删除大文件中的某一行(最有效率的方法)
2017/08/19 Python
flask中主动抛出异常及统一异常处理代码示例
2018/01/18 Python
selenium3+python3环境搭建教程图解
2018/12/07 Python
python实现智能语音天气预报
2019/12/02 Python
Python with标签使用方法解析
2020/01/17 Python
贝斯特韦斯特酒店集团官网:Best Western
2019/01/03 全球购物
创建文明学校实施方案
2014/03/11 职场文书
支行行长竞聘演讲稿
2014/05/15 职场文书
个人债务授权委托书
2014/10/17 职场文书