详解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变量不能以数字打头详解
Jul 06 Python
Windows平台Python连接sqlite3数据库的方法分析
Jul 12 Python
Python实现读取json文件到excel表
Nov 18 Python
Python时间戳使用和相互转换详解
Dec 11 Python
python机器学习理论与实战(二)决策树
Jan 19 Python
Django中的Signal代码详解
Feb 05 Python
Windows下python3.6.4安装教程
Jul 31 Python
解决Python plt.savefig 保存图片时一片空白的问题
Jan 10 Python
Python with关键字,上下文管理器,@contextmanager文件操作示例
Oct 17 Python
python数据库开发之MongoDB安装及Python3操作MongoDB数据库详细方法与实例
Mar 18 Python
如何理解Python中包的引入
May 29 Python
Python实现中英文全文搜索的示例
Dec 04 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
分享下页面关键字抓取www.icbase.com站点代码(带asp.net参数的)
2014/01/30 PHP
采用thinkphp自带方法生成静态html文件详解
2014/06/13 PHP
PHP生成指定随机字符串的简单实现方法
2015/04/01 PHP
php mailer类调用远程SMTP服务器发送邮件实现方法
2016/03/04 PHP
php通过header发送自定义数据方法
2018/01/18 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
2018/02/10 PHP
php 实现简单的登录功能示例【基于thinkPHP框架】
2019/12/02 PHP
你需要知道的JavsScript可以做什么?
2007/06/29 Javascript
兼容ie和firefox js关闭代码
2008/12/11 Javascript
jquery DOM操作 基于命令改变页面
2010/05/06 Javascript
javascript textContent与innerText的异同分析
2010/10/22 Javascript
jquery中append()与appendto()用法分析
2014/11/14 Javascript
window.close(); 关闭浏览器窗口js代码的总结介绍
2016/07/14 Javascript
Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)
2016/09/09 Javascript
input file上传 图片预览功能实例代码
2016/10/25 Javascript
使用JavaScript为一张图片设置备选路径的方法
2017/01/04 Javascript
jquery实现全选、全不选以及单选功能
2017/03/23 jQuery
完美解决手机网页中输入框被输入法遮挡的问题
2017/12/19 Javascript
分享vue里swiper的一些坑
2018/08/30 Javascript
Python中无限元素列表的实现方法
2014/08/18 Python
python实现每次处理一个字符的三种方法
2014/10/09 Python
Python实现网站文件的全备份和差异备份
2014/11/30 Python
numpy 进行数组拼接,分别在行和列上合并的实例
2018/05/08 Python
Python中拆分字符串的操作方法
2019/07/23 Python
Python操作远程服务器 paramiko模块详细介绍
2019/08/07 Python
如何使用pandas读取txt文件中指定的列(有无标题)
2020/03/05 Python
Python使用OpenPyXL处理Excel表格
2020/07/02 Python
Python读写锁实现实现代码解析
2020/11/28 Python
纯css3实现的鼠标悬停动画按钮
2014/12/23 HTML / CSS
Omio美国:全欧洲低价大巴、火车和航班搜索和比价
2017/11/08 全球购物
电子商务专业应届生求职信
2014/05/28 职场文书
企业法人代表任命书
2014/06/06 职场文书
党的群众路线整改落实情况汇报
2014/10/28 职场文书
如何写辞职信
2015/05/13 职场文书
党支部季度考核意见
2015/06/02 职场文书
Python实现文字pdf转换图片pdf效果
2022/04/03 Python