Fixed #27211 -- Made UpdateCacheMiddleware include caching headers for "304 Not Modified" responses.
This commit is contained in:
parent
9459ec82aa
commit
f9702977b7
|
@ -77,7 +77,7 @@ class UpdateCacheMiddleware(MiddlewareMixin):
|
|||
# We don't need to update the cache, just return.
|
||||
return response
|
||||
|
||||
if response.streaming or response.status_code != 200:
|
||||
if response.streaming or response.status_code not in (200, 304):
|
||||
return response
|
||||
|
||||
# Don't cache responses that set a user-specific (and maybe security
|
||||
|
@ -95,7 +95,7 @@ class UpdateCacheMiddleware(MiddlewareMixin):
|
|||
# max-age was set to 0, don't bother caching.
|
||||
return response
|
||||
patch_response_headers(response, timeout)
|
||||
if timeout:
|
||||
if timeout and response.status_code == 200:
|
||||
cache_key = learn_cache_key(request, response, timeout, self.key_prefix, cache=self.cache)
|
||||
if hasattr(response, 'render') and callable(response.render):
|
||||
response.add_post_render_callback(
|
||||
|
|
|
@ -22,7 +22,9 @@ from django.core.cache import (
|
|||
)
|
||||
from django.core.cache.utils import make_template_fragment_key
|
||||
from django.db import connection, connections
|
||||
from django.http import HttpRequest, HttpResponse, StreamingHttpResponse
|
||||
from django.http import (
|
||||
HttpRequest, HttpResponse, HttpResponseNotModified, StreamingHttpResponse,
|
||||
)
|
||||
from django.middleware.cache import (
|
||||
CacheMiddleware, FetchFromCacheMiddleware, UpdateCacheMiddleware,
|
||||
)
|
||||
|
@ -2147,6 +2149,19 @@ class CacheMiddlewareTest(SimpleTestCase):
|
|||
# Inserting a CSRF cookie in a cookie-less request prevented caching.
|
||||
self.assertIsNone(cache_middleware.process_request(request))
|
||||
|
||||
def test_304_response_has_http_caching_headers_but_not_cached(self):
|
||||
original_view = mock.Mock(return_value=HttpResponseNotModified())
|
||||
view = cache_page(2)(original_view)
|
||||
request = self.factory.get('/view/')
|
||||
# The view shouldn't be cached on the second call.
|
||||
view(request).close()
|
||||
response = view(request)
|
||||
response.close()
|
||||
self.assertEqual(original_view.call_count, 2)
|
||||
self.assertIsInstance(response, HttpResponseNotModified)
|
||||
self.assertIn('Cache-Control', response)
|
||||
self.assertIn('Expires', response)
|
||||
|
||||
|
||||
@override_settings(
|
||||
CACHE_MIDDLEWARE_KEY_PREFIX='settingsprefix',
|
||||
|
|
Loading…
Reference in New Issue