详解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函数式编程
Jun 09 Python
基于Python 的进程管理工具supervisor使用指南
Sep 18 Python
Python3之简单搭建自带服务器的实例讲解
Jun 04 Python
python3学习之Splash的安装与实例教程
Jul 09 Python
解决Pycharm出现的部分快捷键无效问题
Oct 22 Python
对pandas的算术运算和数据对齐实例详解
Dec 22 Python
在python3中pyqt5和mayavi不兼容问题的解决方法
Jan 08 Python
Python-copy()与deepcopy()区别详解
Jul 12 Python
详解python 降级到3.6终极解决方案
Feb 06 Python
Python selenium页面加载慢超时的解决方案
Mar 18 Python
Pandas读取csv时如何设置列名
Jun 02 Python
Python RabbitMQ实现简单的进程间通信示例
Jul 02 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循环结构实例讲解
2014/02/10 PHP
php中Session的生成机制、回收机制和存储机制探究
2014/08/19 PHP
Laravel 5框架学习之Laravel入门和新建项目
2015/04/07 PHP
php项目开发中用到的快速排序算法分析
2016/06/25 PHP
爱恋千雪-US-AscII加密解密工具(网页加密)下载
2007/06/06 Javascript
基于jquery库的tab新形式使用
2012/11/16 Javascript
JS基于面向对象实现的放烟花效果
2015/05/07 Javascript
浅谈javascript事件取消和阻止冒泡
2015/05/26 Javascript
使用AngularJS处理单选框和复选框的简单方法
2015/06/19 Javascript
js实现仿阿里巴巴城市选择框效果实例
2015/06/24 Javascript
javascript中数组方法汇总
2015/07/07 Javascript
Bootstrap3 多选和单选框(checkbox)
2016/12/29 Javascript
JS对象创建的几种方式整理
2017/02/28 Javascript
Vue的Class与Style绑定的方法
2017/09/01 Javascript
基于Bootstrap框架菜鸟入门教程(推荐)
2017/09/17 Javascript
微信小程序之选项卡的实现方法
2017/09/29 Javascript
浅析vue深复制
2018/01/29 Javascript
vue.js打包之后可能会遇到的坑!
2018/06/03 Javascript
JS基于对象的链表实现与使用方法示例
2019/01/31 Javascript
Vue-CLI 项目在pycharm中配置方法
2019/08/30 Javascript
基于vue.js仿淘宝收货地址并设置默认地址的案例分析
2020/08/20 Javascript
[01:37]全新的一集《真视界》——TI7总决赛
2017/09/21 DOTA
对pandas的行列名更改与数据选择详解
2018/11/12 Python
详解Python 函数如何重载?
2019/04/23 Python
Pandas删除数据的几种情况(小结)
2019/06/21 Python
python 在右键菜单中加入复制目标文件的有效存放路径(单斜杠或者双反斜杠)
2020/04/08 Python
基于Python爬取京东双十一商品价格曲线
2020/10/23 Python
CSS3之背景尺寸Background-size使用介绍
2013/10/14 HTML / CSS
耐克美国官网:Nike.com
2016/08/01 全球购物
Sport-Thieme荷兰:购买体育用品
2019/08/25 全球购物
交通事故赔偿协议书
2014/04/15 职场文书
教师党的群众路线对照检查材料
2014/09/24 职场文书
运动会开幕式新闻稿
2015/07/17 职场文书
房地产置业顾问工作总结
2015/10/23 职场文书
推广普通话宣传标语口号
2015/12/26 职场文书
matlab xlabel位置的设置方式
2021/05/21 Python