summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAymeric Augustin <aymeric.augustin@m4x.org>2012-12-24 20:25:02 +0100
committerAymeric Augustin <aymeric.augustin@m4x.org>2012-12-24 20:28:07 +0100
commit1c8be95a864540d416602577d1aa03d58ba33168 (patch)
treed911902a8ad237349ffb1aff12bd42d8134f3e9d
parent35d1cd0b28d1d9cd7bffbfbc6cc2e02b58404415 (diff)
Prevented caching of streaming responses.
The test introduced in 4b278131 accidentally passed because of a limitation of Python < 3.3. Refs #17758, #7581.
-rw-r--r--django/middleware/cache.py2
-rw-r--r--tests/regressiontests/cache/tests.py21
2 files changed, 10 insertions, 13 deletions
diff --git a/django/middleware/cache.py b/django/middleware/cache.py
index de2b86f630..83860e15f3 100644
--- a/django/middleware/cache.py
+++ b/django/middleware/cache.py
@@ -93,7 +93,7 @@ class UpdateCacheMiddleware(object):
if not self._should_update_cache(request, response):
# We don't need to update the cache, just return.
return response
- if not response.status_code == 200:
+ if response.streaming or response.status_code != 200:
return response
# Try to get the timeout from the "max-age" section of the "Cache-
# Control" header before reverting to using the default cache_timeout
diff --git a/tests/regressiontests/cache/tests.py b/tests/regressiontests/cache/tests.py
index fc92ecf870..4d6dc8fcd0 100644
--- a/tests/regressiontests/cache/tests.py
+++ b/tests/regressiontests/cache/tests.py
@@ -1428,24 +1428,21 @@ class CacheI18nTest(TestCase):
CACHE_MIDDLEWARE_SECONDS=60,
USE_ETAGS=True,
)
- def test_middleware_with_streaming_response(self):
- # cache with non empty request.GET
- request = self._get_request_cache(query_string='foo=baz&other=true')
-
- # first access, cache must return None
+ def test_middleware_doesnt_cache_streaming_response(self):
+ request = self._get_request()
get_cache_data = FetchFromCacheMiddleware().process_request(request)
- self.assertEqual(get_cache_data, None)
+ self.assertIsNone(get_cache_data)
- # pass streaming response through UpdateCacheMiddleware.
- content = 'Check for cache with QUERY_STRING and streaming content'
+ # This test passes on Python < 3.3 even without the corresponding code
+ # in UpdateCacheMiddleware, because pickling a StreamingHttpResponse
+ # fails (http://bugs.python.org/issue14288). LocMemCache silently
+ # swallows the exception and doesn't store the response in cache.
+ content = ['Check for cache with streaming content.']
response = StreamingHttpResponse(content)
UpdateCacheMiddleware().process_response(request, response)
- # second access, cache must still return None, because we can't cache
- # streaming response.
get_cache_data = FetchFromCacheMiddleware().process_request(request)
- self.assertEqual(get_cache_data, None)
-
+ self.assertIsNone(get_cache_data)
@override_settings(
CACHES={