详解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 列表list使用介绍
Nov 30 Python
python3音乐播放器简单实现代码
Apr 20 Python
WINDOWS 同时安装 python2 python3 后 pip 错误的解决方法
Mar 16 Python
python购物车程序简单代码
Apr 18 Python
Python把csv数据写入list和字典类型的变量脚本方法
Jun 15 Python
深入理解Python中的 __new__ 和 __init__及区别介绍
Sep 17 Python
Python实现快速排序的方法详解
Oct 25 Python
python中for循环变量作用域及用法详解
Nov 05 Python
使用python matplotlib 画图导入到word中如何保证分辨率
Apr 16 Python
如何教少儿学习Python编程
Jul 10 Python
Django跨域请求原理及实现代码
Nov 14 Python
基于Python实现对比Exce的工具
Apr 07 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 小心urldecode引发的SQL注入漏洞
2011/10/27 PHP
又十个超级有用的PHP代码片段
2015/09/24 PHP
php简单计算年龄的方法(周岁与虚岁)
2016/12/06 PHP
php微信开发之谷歌测距
2018/06/14 PHP
PHP PDOStatement::debugDumpParams讲解
2019/01/30 PHP
PHP PDOStatement::setAttribute讲解
2019/02/01 PHP
laravel中数据显示方法(默认值和下拉option默认选中)
2019/10/11 PHP
Js+XML 操作
2006/09/20 Javascript
仿微博字符限制效果实现代码
2012/04/20 Javascript
使用jQuery实现验证上传图片的格式与大小
2014/12/03 Javascript
JavaScript数组去重的两种方法推荐
2016/04/05 Javascript
基于jQuery实现选项卡效果
2017/01/04 Javascript
vue实现添加标签demo示例代码
2017/01/21 Javascript
原生js实现轮播图的示例代码
2017/02/20 Javascript
基于React Native 0.52实现轮播图效果
2020/08/25 Javascript
JavaScript文本特效实例小结【3个示例】
2018/12/22 Javascript
echarts多条折线图动态分层的实现方法
2019/05/24 Javascript
Vue中的transition封装组件的实现方法
2019/08/13 Javascript
浅析webpack-bundle-analyzer在vue-cli3中的使用
2019/10/23 Javascript
JavaScript简易计算器制作
2020/01/17 Javascript
[00:50]深扒TI7聊天轮盘语音出处6
2017/05/11 DOTA
详解python中的hashlib模块的使用
2019/04/22 Python
Numpy数组array和矩阵matrix转换方法
2019/08/05 Python
Django实现发送邮件找回密码功能
2019/08/12 Python
python如何更新包
2020/06/11 Python
python字符串的index和find的区别详解
2020/06/20 Python
python 抓取知乎指定回答下视频的方法
2020/07/09 Python
Flask中sqlalchemy模块的实例用法
2020/08/02 Python
selenium+python自动化78-autoit参数化与批量上传功能的实现
2021/03/04 Python
办公文员的工作岗位职责
2013/11/12 职场文书
出纳岗位职责范本
2013/12/01 职场文书
幼儿园国庆节活动方案
2014/02/01 职场文书
服务行业演讲稿
2014/09/02 职场文书
师德师风自查总结
2014/10/14 职场文书
彩虹社八名人气艺人全新周边限时推出,性转女装男装一次拥有!
2022/04/01 日漫
React四级菜单的实现
2022/04/08 Javascript