详解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 merge、concat合并数据集的实例讲解
Apr 12 Python
pygame游戏之旅 调用按钮实现游戏开始功能
Nov 21 Python
Python基于滑动平均思想实现缺失数据填充的方法
Feb 21 Python
Python实现多态、协议和鸭子类型的代码详解
May 05 Python
用pycharm开发django项目示例代码
Jun 13 Python
django使用xadmin的全局配置详解
Nov 15 Python
Python综合应用名片管理系统案例详解
Jan 03 Python
Python实现自动打开电脑应用的示例代码
Apr 17 Python
python实现密码验证合格程序的思路详解
Jun 01 Python
Python django框架 web端视频加密的实例详解
Nov 20 Python
matplotlib对象拾取事件处理的实现
Jan 14 Python
python数字图像处理之图像的批量处理
Jun 28 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三元运算的2种写法代码实例
2014/05/12 PHP
配置Nginx+PHP的正确思路与过程
2016/05/10 PHP
PHP数组操作简单案例分析
2016/10/15 PHP
PHP实现的分页类定义与用法示例
2017/07/05 PHP
jquery 打开窗口返回值实现代码
2010/03/04 Javascript
ajax异步刷新实现更新数据库
2012/12/03 Javascript
关于在IE下的一个安全BUG --可用于跟踪用户的系统鼠标位置
2013/04/17 Javascript
3种不同方式的焦点图轮播特效分享
2013/10/30 Javascript
解析prototype,JQuery中跳出each循环的方法
2013/12/12 Javascript
jQuery中attr()和prop()在修改checked属性时的区别
2014/07/18 Javascript
jQuery中last()方法用法实例
2015/01/06 Javascript
jQuery实现动态表单验证时文本框抖动效果完整实例
2015/08/21 Javascript
jQuery实现元素拖拽并cookie保存顺序的方法
2016/02/20 Javascript
AngularJs Understanding the Model Component
2016/09/02 Javascript
Vue 中 a标签上href无法跳转的解决方式
2019/11/12 Javascript
Windows下安装 node 的版本控制工具 nvm
2020/02/06 Javascript
python使用scrapy解析js示例
2014/01/23 Python
Python 实现 贪吃蛇大作战 代码分享
2016/09/07 Python
对python 判断数字是否小于0的方法详解
2019/01/26 Python
python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)
2019/04/18 Python
python的内存管理和垃圾回收机制详解
2019/05/18 Python
如何使用Python标准库进行性能测试
2019/06/25 Python
Python获取好友地区分布及好友性别分布情况代码详解
2019/07/10 Python
Python学习笔记之Django创建第一个数据库模型的方法
2019/08/07 Python
python不使用for计算两组、多个矩形两两间的iou方式
2020/01/18 Python
Windows 平台做 Python 开发的最佳组合(推荐)
2020/07/27 Python
python用tkinter实现一个简易能进行随机点名的界面
2020/09/27 Python
个人自我鉴定
2013/11/07 职场文书
四查四看剖析材料
2014/02/14 职场文书
《春到梅花山》教学反思
2014/04/16 职场文书
创先争优标语
2014/06/27 职场文书
争当四好少年演讲稿
2014/09/13 职场文书
农业项目投资意向书
2015/05/09 职场文书
交通事故责任认定书
2015/08/06 职场文书
如何利用python和DOS获取wifi密码
2021/03/31 Python
vue配置型表格基于el-table拓展之table-plus组件
2022/04/12 Vue.js