Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

[1.5.x] Prevented caching of streaming responses.

The test introduced in 4b27813 accidentally passed because of a
limitation of Python < 3.3.

Refs #17758, #7581.

Backport of 1c8be95 from master.
  • Loading branch information...
commit cd914175c8209c5f366e87d94f8f6d050347757d 1 parent ef98ae2
@aaugustin aaugustin authored
Showing with 10 additions and 13 deletions.
  1. +1 −1  django/middleware/cache.py
  2. +9 −12 tests/regressiontests/cache/tests.py
View
2  django/middleware/cache.py
@@ -93,7 +93,7 @@ def process_response(self, request, response):
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
View
21 tests/regressiontests/cache/tests.py
@@ -1424,24 +1424,21 @@ def set_cache(request, lang, msg):
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={
Please sign in to comment.
Something went wrong with that request. Please try again.