ySJ
|
2.0/chapter15/#381 |
2010-04-23 10:05:45
|
该函数设置或增加 Vary header ,例如:
|
|
ySJ
|
2.0/chapter15/#374 |
2010-04-23 09:54:31
|
由于根据 cookie 而区分对待是很常见的情况,因此有 <literal>vary_on_cookie</literal> 装饰器。
|
|
ySJ
|
2.0/chapter15/#366 |
2010-04-23 09:52:41
|
使用 <literal>vary_on_headers</literal> 装饰器而不是手动设置 <literal>Vary</literal> 头部(使用像 <literal>response['Vary'] = 'user-agent'</literal> 之类的代码)的好处是修饰器在(可能已经存在的) <emphasis>Vary</emphasis> 之上进行 <literal>添加</literal> ,而不是从零开始设置,且可能覆盖该处已经存在的设置。
|
|
ySJ
|
2.0/chapter15/#364 |
2010-04-23 09:51:02
|
在这种情况下,缓存机制(如 Django 自己的缓存中间件)将会为每一个单独的用户浏览器缓存一个独立的页面版本。
|
|
ySJ
|
2.0/chapter15/#361 |
2010-04-23 09:48:57
|
要在 Django 完成这项工作,可使用便利的 <literal>vary_on_headers</literal> 视图装饰器,如下所示:
|
|
ySJ
|
2.0/chapter15/#355 |
2010-04-23 09:48:37
|
<literal>Vary</literal> 头部定义了缓存机制在构建其缓存键值时应当将哪个请求头标考虑在内。
|
|
ySJ
|
2.0/chapter15/#353 |
2010-04-23 09:48:28
|
使用 Vary头部
|
|
ySJ
|
2.0/chapter15/#359 |
2010-04-23 09:48:15
|
除非你使用<literal>Vary</literal>头部通知缓存机制页面输出要依据请求头里的cookie,语言等的设置而不同。
|
|
ySJ
|
2.0/chapter15/#358 |
2010-04-23 09:45:45
|
缺省情况下,Django 的缓存系统使用所请求的路径(比如:<literal>"/stories/2005/jun/23/bank_robbed/"</literal> )来创建其缓存键。这意味着每次请求都会使用同样的缓存版本,不考虑才客户端cookie和语言配置的不同。
|
|
ySJ
|
2.0/chapter15/#328 |
2010-04-23 09:20:06
|
上游缓存。
|
|
ySJ
|
2.0/chapter15/#322 |
2010-04-22 17:28:27
|
然而,如果后端并不原生支持增减操作,也可以通过取值/更新两步操作来实现。
|
|
ySJ
|
2.0/chapter15/#321 |
2010-04-22 17:27:28
|
在支持原子增减的缓存后端上(最著名的是memcached),增减操作才是原子的。
|
|
ySJ
|
2.0/chapter15/#321 |
2010-04-22 17:27:03
|
在支持原子增减的缓存后台上(最著名的是memcached),增减操作才是原子的。
|
|
ySJ
|
2.0/chapter15/#320 |
2010-04-22 17:25:21
|
<literal>incr()</literal>/<literal>decr()</literal>方法不是原子操作。
|
|
ySJ
|
2.0/chapter15/#318 |
2010-04-22 17:24:17
|
注意
|
|
ySJ
|
2.0/chapter15/#315 |
2010-04-22 17:24:07
|
如果尝试增减不存在的键值会抛出ValueError。
|
|
ySJ
|
2.0/chapter15/#314 |
2010-04-22 17:23:28
|
默认情况下,增加或减少的值是1。可以用参数来制定其他值。
|
|
ySJ
|
2.0/chapter15/#313 |
2010-04-22 17:22:08
|
也可以使用<literal>incr()</literal>或者<literal>decr()</literal>来增加或者减少已经存在的键值。
|
|
ySJ
|
2.0/chapter15/#306 |
2010-04-22 17:20:52
|
还有个<literal>get_many()</literal>接口。
|
|
ySJ
|
2.0/chapter15/#306 |
2010-04-22 17:19:17
|
还有个<literal>get_many()</literal>。
|
|
ySJ
|
2.0/chapter15/#304 |
2010-04-22 17:13:02
|
成功返回True,失败返回False。
|
|
ySJ
|
2.0/chapter15/#303 |
2010-04-22 17:12:29
|
如果想确定<literal>add()</literal>是否成功添加了缓存值,你应该测试返回值。
|
|
ySJ
|
2.0/chapter15/#300 |
2010-04-22 17:11:08
|
它接受的参数和<literal>set()</literal>一样,但是并不去尝试更新已经存在的键值。
|
|
ySJ
|
2.0/chapter15/#299 |
2010-04-22 17:09:51
|
使用<literal>add()</literal>方法来新增一个原来没有的键值。
|
|
ySJ
|
2.0/chapter15/#296 |
2010-04-22 17:08:26
|
它指定了当缓存中不存在该对象时所返回的值:
|
|
ySJ
|
2.0/chapter15/#293 |
2010-04-22 17:08:07
|
我们不建议在缓存中保存 <literal>None</literal> 常量,因为你将无法区分你保存的 <literal>None</literal> 变量及由返回值 <literal>None</literal> 所标识的缓存未命中。
|
|
ySJ
|
2.0/chapter15/#293 |
2010-04-22 17:07:55
|
我们不建议在缓存中保存 <literal>None</literal> 常量,因为你将无法区分你保存的 <literal>None</literal> 变量及由返回值 <literal>None</literal> 所标识的缓存未中。
|
|
ySJ
|
2.0/chapter15/#290 |
2010-04-22 17:07:08
|
如果缓存中不存在该对象,那么<literal>cache.get()</literal>会返回<literal>None</literal>。
|
|
ySJ
|
2.0/chapter15/#282 |
2010-04-22 17:05:33
|
缓存模块<literal>django.core.cache</literal>拥有一个自动依据<literal>CACHE_BACKEND</literal>设置创建的<literal>django.core.cache</literal>对象。
|
|
ySJ
|
2.0/chapter15/#280 |
2010-04-22 17:03:34
|
(查阅 Python 文档可以了解到更多关于 pickling 的信息。)
|
|
ySJ
|
2.0/chapter15/#279 |
2010-04-22 17:03:20
|
字符串、字典和模型对象列表等等。
|
|
ySJ
|
2.0/chapter15/#277 |
2010-04-22 17:02:31
|
你可以通过这个API,以任何你需要的粒度来缓存对象。
|
|
ySJ
|
2.0/chapter15/#276 |
2010-04-22 17:00:09
|
针对这样的情况,Django提供了简单低级的缓存API。
|
|
ySJ
|
2.0/chapter15/#271 |
2010-04-22 16:58:03
|
有些时候,对整个经解析的页面进行缓存并不会给你带来太多好处,事实上可能会过犹不及。
|
|
ySJ
|
2.0/chapter15/#267 |
2010-04-22 16:56:17
|
可以把超时时间保存在变量里,然后在别的地方复用。
|
|
ySJ
|
2.0/chapter15/#266 |
2010-04-22 16:54:35
|
这个特性在避免模板重复方面非常有用。
|
|
ySJ
|
2.0/chapter15/#263 |
2010-04-22 16:53:59
|
例如,如果模板变量<literal>my_timeout</literal>值为600,那么以下两个例子是等价的。
|
|
ySJ
|
2.0/chapter15/#262 |
2010-04-22 16:52:54
|
缓存超时时间可以作为模板变量,只要它可以解析为整数值。
|
|
ySJ
|
2.0/chapter15/#260 |
2010-04-22 16:50:14
|
简单地把参数传给<literal>{% cache %}</literal>。
|
|
ySJ
|
2.0/chapter15/#259 |
2010-04-22 16:49:42
|
传递不止一个参数也是可行的。
|
|
ySJ
|
2.0/chapter15/#256 |
2010-04-22 16:47:38
|
这样只需要给<literal>{% cache %}</literal>传递额外的参数以标识缓存片段。
|
|
ySJ
|
2.0/chapter15/#255 |
2010-04-22 16:45:17
|
比如,你想为上一个例子的每个用户分别缓存侧边栏。
|
|
ySJ
|
2.0/chapter15/#254 |
2010-04-22 16:43:55
|
有时你可能想缓存基于片段的动态内容的多份拷贝。
|
|
ySJ
|
2.0/chapter15/#250 |
2010-04-22 16:42:02
|
缓存超时时间(以秒计)和指定缓存片段的名称。
|
|
ySJ
|
2.0/chapter15/#248 |
2010-04-22 16:41:04
|
模板标签<literal>{% cache %}</literal>在给定的时间内缓存了块的内容。
|
|
ySJ
|
2.0/chapter15/#246 |
2010-04-22 16:39:54
|
在模板的顶端附近加入<literal>{% load cache %}</literal>以通知模板存取缓存标签。
|
|
ySJ
|
2.0/chapter15/#245 |
2010-04-22 16:38:00
|
你同样可以使用<literal>cache</literal>标签来缓存模板片段。
|
|
ySJ
|
2.0/chapter15/#241 |
2010-04-22 16:34:44
|
如果采取这种方法, 不要忘记在 URLconf 中导入 <literal>cache_page</literal>。
|
|
ySJ
|
2.0/chapter15/#235 |
2010-04-22 16:34:03
|
这是之前的URLconf:
|
|
ySJ
|
2.0/chapter15/#213 |
2010-04-22 16:28:18
|
以秒计的缓存超时时间。
|
|