Made several grammar fixes to cache documentation from [1020]
git-svn-id: http://code.djangoproject.com/svn/django/trunk@1030 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
fb55717a09
commit
cbe2426369
|
@ -22,19 +22,19 @@ from django.conf import settings
|
||||||
from django.core.cache import cache
|
from django.core.cache import cache
|
||||||
|
|
||||||
cc_delim_re = re.compile(r'\s*,\s*')
|
cc_delim_re = re.compile(r'\s*,\s*')
|
||||||
|
|
||||||
def patch_cache_control(response, **kwargs):
|
def patch_cache_control(response, **kwargs):
|
||||||
"""
|
"""
|
||||||
This function patches the Cache-Control header by adding all
|
This function patches the Cache-Control header by adding all
|
||||||
keyword arguments to it. The transformation is as follows:
|
keyword arguments to it. The transformation is as follows:
|
||||||
|
|
||||||
- all keyword parameter names are turned to lowercase and
|
* All keyword parameter names are turned to lowercase, and underscores
|
||||||
all _ will be translated to -
|
are converted to hyphens.
|
||||||
- if the value of a parameter is True (exatly True, not just a
|
* If the value of a parameter is True (exactly True, not just a
|
||||||
true value), only the parameter name is added to the header
|
true value), only the parameter name is added to the header.
|
||||||
- all other parameters are added with their value, after applying
|
* All other parameters are added with their value, after applying
|
||||||
str to it.
|
str() to it.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def dictitem(s):
|
def dictitem(s):
|
||||||
t = s.split('=',1)
|
t = s.split('=',1)
|
||||||
if len(t) > 1:
|
if len(t) > 1:
|
||||||
|
@ -49,9 +49,7 @@ def patch_cache_control(response, **kwargs):
|
||||||
return t[0] + '=' + str(t[1])
|
return t[0] + '=' + str(t[1])
|
||||||
|
|
||||||
if response.has_header('Cache-Control'):
|
if response.has_header('Cache-Control'):
|
||||||
print response['Cache-Control']
|
|
||||||
cc = cc_delim_re.split(response['Cache-Control'])
|
cc = cc_delim_re.split(response['Cache-Control'])
|
||||||
print cc
|
|
||||||
cc = dict([dictitem(el) for el in cc])
|
cc = dict([dictitem(el) for el in cc])
|
||||||
else:
|
else:
|
||||||
cc = {}
|
cc = {}
|
||||||
|
|
|
@ -272,39 +272,65 @@ and a list/tuple of header names as its second argument.
|
||||||
|
|
||||||
.. _`HTTP Vary headers`: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.44
|
.. _`HTTP Vary headers`: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.44
|
||||||
|
|
||||||
Controlling cache: Using Vary headers
|
Controlling cache: Using other headers
|
||||||
=====================================
|
======================================
|
||||||
|
|
||||||
Another problem with caching is the privacy of data, and the question where data can
|
Another problem with caching is the privacy of data and the question of where
|
||||||
be stored in a cascade of caches. A user usually faces two kinds of caches: his own
|
data should be stored in a cascade of caches.
|
||||||
browser cache (a private cache) and his providers cache (a public cache). A public cache
|
|
||||||
is used by multiple users and controlled by someone else. This poses problems with private
|
|
||||||
(in the sense of sensitive) data - you don't want your social security number or your
|
|
||||||
banking account numbers stored in some public cache. So web applications need a way
|
|
||||||
to tell the caches what data is private and what is public.
|
|
||||||
|
|
||||||
Other aspects are the definition how long a page should be cached at max, or wether the
|
A user usually faces two kinds of caches: his own browser cache (a private
|
||||||
cache should allways check for newer versions and only deliver the cache content when
|
cache) and his provider's cache (a public cache). A public cache is used by
|
||||||
there were no changes (some caches might deliver cached content even if the server page
|
multiple users and controlled by someone else. This poses problems with
|
||||||
changed - just because the cache copy isn't yet expired).
|
sensitive data: You don't want, say, your banking-account number stored in a
|
||||||
|
public cache. So Web applications need a way to tell caches which data is
|
||||||
|
private and which is public.
|
||||||
|
|
||||||
So there are a multitude of options you can control for your pages. This is where the
|
The solution is to indicate a page's cache should be "private." To do this in
|
||||||
Cache-Control header (more infos in `HTTP Cache-Control headers`_) comes in. The usage
|
Django, use the ``cache_control`` view decorator. Example::
|
||||||
is quite simple::
|
|
||||||
|
|
||||||
@cache_control(private=True, must_revalidate=True, max_age=3600)
|
from django.views.decorators.cache import cache_control
|
||||||
|
@cache_control(private=True)
|
||||||
def my_view(request):
|
def my_view(request):
|
||||||
...
|
...
|
||||||
|
|
||||||
This would define the view as private, to be revalidated on every access and cache
|
This decorator takes care of sending out the appropriate HTTP header behind the
|
||||||
copies will only be stored for 3600 seconds at max.
|
scenes.
|
||||||
|
|
||||||
The caching middleware already set's this header up with a max-age of the CACHE_MIDDLEWARE_SETTINGS
|
There are a few other ways to control cache parameters. For example, HTTP
|
||||||
setting. And the cache_page decorator does the same. The cache_control decorator correctly merges
|
allows applications to do the following:
|
||||||
different values into one big header, though. But you should take into account that middlewares
|
|
||||||
might overwrite some of your headers or set their own defaults if you don't give that header yourself.
|
|
||||||
|
|
||||||
.. _`HTTP Cache-Control headers`: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9
|
* Define the maximum time a page should be cached.
|
||||||
|
* Specify whether a cache should always check for newer versions, only
|
||||||
|
delivering the cached content when there are no changes. (Some caches
|
||||||
|
might deliver cached content even if the server page changed -- simply
|
||||||
|
because the cache copy isn't yet expired.)
|
||||||
|
|
||||||
|
In Django, use the ``cache_control`` view decorator to specify these cache
|
||||||
|
parameters. In this example, the ``cache_control`` decorator tells caches to
|
||||||
|
revalidate the cache on every access and to store cached versions for, at most,
|
||||||
|
3600 seconds::
|
||||||
|
|
||||||
|
from django.views.decorators.cache import cache_control
|
||||||
|
@cache_control(must_revalidate=True, max_age=3600)
|
||||||
|
def my_view(request):
|
||||||
|
...
|
||||||
|
|
||||||
|
Any valid Cache-Control directive is valid in ``cache_control()``. For a full
|
||||||
|
list, see the `Cache-Control spec`_. Just pass the directives as keyword
|
||||||
|
arguments to ``cache_control()``, substituting underscores for hyphens. For
|
||||||
|
directives that don't take an argument, set the argument to ``True``.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
``@cache_control(max_age=3600)`` turns into ``max-age=3600``.
|
||||||
|
``@cache_control(public=True)`` turns into ``public``.
|
||||||
|
|
||||||
|
(Note that the caching middleware already sets the cache header's max-age with
|
||||||
|
the value of the ``CACHE_MIDDLEWARE_SETTINGS`` setting. If you use a custom
|
||||||
|
``max_age`` in a ``cache_control`` decorator, the decorator will take
|
||||||
|
precedence, and the header values will be merged correctly.)
|
||||||
|
|
||||||
|
.. _`Cache-Control spec`: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9
|
||||||
|
|
||||||
Other optimizations
|
Other optimizations
|
||||||
===================
|
===================
|
||||||
|
|
Loading…
Reference in New Issue