1
0
mirror of https://github.com/django/django.git synced 2025-06-05 03:29:12 +00:00

Fixed #25782 – duplicate cache skip on header

This commit is contained in:
wassef911 2024-07-08 22:26:18 +01:00
parent f04d3d4c0d
commit b4f0ca776c
No known key found for this signature in database
GPG Key ID: A4166E2C2C794D2C
2 changed files with 18 additions and 11 deletions

View File

@ -121,11 +121,10 @@ class UpdateCacheMiddleware(MiddlewareMixin):
cache_key = learn_cache_key( cache_key = learn_cache_key(
request, response, timeout, self.key_prefix, cache=self.cache request, response, timeout, self.key_prefix, cache=self.cache
) )
# check header for "x-successive-cache" to avoid multiple cache sets # avoid multiple cache sets
# if not found, set it as key used if response.has_header("X-Cache-Success"):
if response.has_header("x-successive-cache"):
return response return response
response["x-successive-cache"] = cache_key response["X-Cache-Success"] = "true"
if hasattr(response, "render") and callable(response.render): if hasattr(response, "render") and callable(response.render):
response.add_post_render_callback( response.add_post_render_callback(

22
tests/cache/tests.py vendored
View File

@ -2996,11 +2996,13 @@ class CacheHandlerTest(SimpleTestCase):
}, },
) )
class DuplicateCacheKey(TestCase): class DuplicateCacheKey(TestCase):
def test_cache_page_conflict(self): @mock.patch("time.sleep")
def test_cache_page_conflict(self, mock_sleep):
"""cache_page isn't causing duplicates with middlewares""" """cache_page isn't causing duplicates with middlewares"""
@cache_page(3000, cache="other") @cache_page(3000, cache="other")
def test_view(request): def test_view(request):
time.sleep(1)
return HttpResponse(b"Hello, world") return HttpResponse(b"Hello, world")
request = RequestFactory().get("/view/") request = RequestFactory().get("/view/")
@ -3009,16 +3011,22 @@ class DuplicateCacheKey(TestCase):
"5b30bdb36b35025daf3570b18c3bb916.d41d8cd98f00b204e9800998ecf8427e.en" "5b30bdb36b35025daf3570b18c3bb916.d41d8cd98f00b204e9800998ecf8427e.en"
) )
self.assertEqual(caches["default"].has_key(cache_key), False) self.assertFalse(caches["default"].has_key(cache_key))
self.assertEqual(caches["other"].has_key(cache_key), False) self.assertFalse(caches["other"].has_key(cache_key))
UpdateCacheMiddleware(test_view)(request) UpdateCacheMiddleware(test_view)(request)
self.assertEqual(caches["other"].has_key(cache_key), True) self.assertTrue(caches["other"].has_key(cache_key))
self.assertEqual(caches["default"].has_key(cache_key), False) self.assertFalse(caches["default"].has_key(cache_key))
mock_sleep.assert_called_once()
mock_sleep.reset_mock()
CacheMiddleware(test_view)(request) CacheMiddleware(test_view)(request)
self.assertEqual(caches["other"].has_key(cache_key), True) self.assertTrue(caches["other"].has_key(cache_key))
self.assertEqual(caches["default"].has_key(cache_key), False) self.assertFalse(caches["default"].has_key(cache_key))
mock_sleep.assert_not_called()
response = test_view(request) response = test_view(request)
self.assertEqual(response.content, b"Hello, world") self.assertEqual(response.content, b"Hello, world")
self.assertTrue(caches["other"].has_key(cache_key))
self.assertFalse(caches["default"].has_key(cache_key))
mock_sleep.assert_not_called()