summaryrefslogtreecommitdiff
path: root/django/utils
diff options
context:
space:
mode:
authorMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2007-11-03 02:16:27 +0000
committerMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2007-11-03 02:16:27 +0000
commit44df4e390fc9e037a3ab2775ffd695c80831f0ee (patch)
tree3166defa7edc23c01b4ad8d66c4aac10d3c53860 /django/utils
parentf189280eb39b20a8cfdb6b9416df1176e107550d (diff)
queryset-refactor: Merged from trunk up to [6635].
git-svn-id: http://code.djangoproject.com/svn/django/branches/queryset-refactor@6638 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django/utils')
-rw-r--r--django/utils/cache.py30
-rw-r--r--django/utils/http.py28
2 files changed, 45 insertions, 13 deletions
diff --git a/django/utils/cache.py b/django/utils/cache.py
index f192e1115c..ae4de6dd87 100644
--- a/django/utils/cache.py
+++ b/django/utils/cache.py
@@ -13,17 +13,18 @@ into account when building its cache key. Requests with the same path but
different header content for headers named in "Vary" need to get different
cache keys to prevent delivery of wrong content.
-A example: i18n middleware would need to distinguish caches by the
+An example: i18n middleware would need to distinguish caches by the
"Accept-language" header.
"""
import md5
import re
import time
-from email.Utils import formatdate
+
from django.conf import settings
from django.core.cache import cache
from django.utils.encoding import smart_str, iri_to_uri
+from django.utils.http import http_date
cc_delim_re = re.compile(r'\s*,\s*')
@@ -40,7 +41,7 @@ def patch_cache_control(response, **kwargs):
str() to it.
"""
def dictitem(s):
- t = s.split('=',1)
+ t = s.split('=', 1)
if len(t) > 1:
return (t[0].lower(), t[1])
else:
@@ -64,7 +65,7 @@ def patch_cache_control(response, **kwargs):
if 'max-age' in cc and 'max_age' in kwargs:
kwargs['max_age'] = min(cc['max-age'], kwargs['max_age'])
- for (k,v) in kwargs.items():
+ for (k, v) in kwargs.items():
cc[k.replace('_', '-')] = v
cc = ', '.join([dictvalue(el) for el in cc.items()])
response['Cache-Control'] = cc
@@ -88,15 +89,14 @@ def patch_response_headers(response, cache_timeout=None):
if not response.has_header('ETag'):
response['ETag'] = md5.new(response.content).hexdigest()
if not response.has_header('Last-Modified'):
- response['Last-Modified'] = formatdate()[:26] + "GMT"
+ response['Last-Modified'] = http_date()
if not response.has_header('Expires'):
- response['Expires'] = formatdate(time.time() + cache_timeout)[:26] + "GMT"
+ response['Expires'] = http_date(time.time() + cache_timeout)
patch_cache_control(response, max_age=cache_timeout)
def add_never_cache_headers(response):
"""
- Add headers to a response to indicate that
- a page should never be cached.
+ Adds headers to a response to indicate that a page should never be cached.
"""
patch_response_headers(response, cache_timeout=-1)
@@ -119,13 +119,14 @@ def patch_vary_headers(response, newheaders):
response['Vary'] = ', '.join(vary)
def _generate_cache_key(request, headerlist, key_prefix):
- "Returns a cache key from the headers given in the header list."
+ """Returns a cache key from the headers given in the header list."""
ctx = md5.new()
for header in headerlist:
value = request.META.get(header, None)
if value is not None:
ctx.update(value)
- return 'views.decorators.cache.cache_page.%s.%s.%s' % (key_prefix, iri_to_uri(request.path), ctx.hexdigest())
+ return 'views.decorators.cache.cache_page.%s.%s.%s' % (
+ key_prefix, iri_to_uri(request.path), ctx.hexdigest())
def get_cache_key(request, key_prefix=None):
"""
@@ -139,7 +140,8 @@ def get_cache_key(request, key_prefix=None):
"""
if key_prefix is None:
key_prefix = settings.CACHE_MIDDLEWARE_KEY_PREFIX
- cache_key = 'views.decorators.cache.cache_header.%s.%s' % (key_prefix, iri_to_uri(request.path))
+ cache_key = 'views.decorators.cache.cache_header.%s.%s' % (
+ key_prefix, iri_to_uri(request.path))
headerlist = cache.get(cache_key, None)
if headerlist is not None:
return _generate_cache_key(request, headerlist, key_prefix)
@@ -163,9 +165,11 @@ def learn_cache_key(request, response, cache_timeout=None, key_prefix=None):
key_prefix = settings.CACHE_MIDDLEWARE_KEY_PREFIX
if cache_timeout is None:
cache_timeout = settings.CACHE_MIDDLEWARE_SECONDS
- cache_key = 'views.decorators.cache.cache_header.%s.%s' % (key_prefix, iri_to_uri(request.path))
+ cache_key = 'views.decorators.cache.cache_header.%s.%s' % (
+ key_prefix, iri_to_uri(request.path))
if response.has_header('Vary'):
- headerlist = ['HTTP_'+header.upper().replace('-', '_') for header in vary_delim_re.split(response['Vary'])]
+ headerlist = ['HTTP_'+header.upper().replace('-', '_')
+ for header in vary_delim_re.split(response['Vary'])]
cache.set(cache_key, headerlist, cache_timeout)
return _generate_cache_key(request, headerlist, key_prefix)
else:
diff --git a/django/utils/http.py b/django/utils/http.py
index 4912c9c46a..5ec6e92d28 100644
--- a/django/utils/http.py
+++ b/django/utils/http.py
@@ -1,4 +1,6 @@
import urllib
+from email.Utils import formatdate
+
from django.utils.encoding import smart_str, force_unicode
from django.utils.functional import allow_lazy
@@ -37,3 +39,29 @@ def urlencode(query, doseq=0):
for k, v in query],
doseq)
+def cookie_date(epoch_seconds=None):
+ """
+ Formats the time to ensure compatibility with Netscape's cookie standard.
+
+ Accepts a floating point number expressed in seconds since the epoch, in
+ UTC - such as that outputted by time.time(). If set to None, defaults to
+ the current time.
+
+ Outputs a string in the format 'Wdy, DD-Mon-YYYY HH:MM:SS GMT'.
+ """
+ rfcdate = formatdate(epoch_seconds)
+ return '%s-%s-%s GMT' % (rfcdate[:7], rfcdate[8:11], rfcdate[12:25])
+
+def http_date(epoch_seconds=None):
+ """
+ Formats the time to match the RFC1123 date format as specified by HTTP
+ RFC2616 section 3.3.1.
+
+ Accepts a floating point number expressed in seconds since the epoch, in
+ UTC - such as that outputted by time.time(). If set to None, defaults to
+ the current time.
+
+ Outputs a string in the format 'Wdy, DD Mon YYYY HH:MM:SS GMT'.
+ """
+ rfcdate = formatdate(epoch_seconds)
+ return '%s GMT' % rfcdate[:25]