浏览代码

Prevented caching of streaming responses.

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

Refs #17758, #7581.
Aymeric Augustin 12 年之前
父节点
当前提交
1c8be95a86
共有 2 个文件被更改,包括 10 次插入13 次删除
  1. 1 1
      django/middleware/cache.py
  2. 9 12
      tests/regressiontests/cache/tests.py

+ 1 - 1
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

+ 9 - 12
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={