From f04d3d4c0dd9418c8c28c1c0c5951388c3eab11c Mon Sep 17 00:00:00 2001 From: wassef911 <1.wassef911@gmail.com> Date: Sat, 6 Jul 2024 21:00:10 +0100 Subject: [PATCH] =?UTF-8?q?Fixed=20#25782=20=E2=80=93=20duplicate=20cache?= =?UTF-8?q?=20using=20CacheMiddleware=20and=20cache=5Fpage.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- django/middleware/cache.py | 6 ++++++ tests/cache/tests.py | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/django/middleware/cache.py b/django/middleware/cache.py index 196b1995ff..4157b84984 100644 --- a/django/middleware/cache.py +++ b/django/middleware/cache.py @@ -121,6 +121,12 @@ class UpdateCacheMiddleware(MiddlewareMixin): cache_key = learn_cache_key( request, response, timeout, self.key_prefix, cache=self.cache ) + # check header for "x-successive-cache" to avoid multiple cache sets + # if not found, set it as key used + if response.has_header("x-successive-cache"): + return response + response["x-successive-cache"] = cache_key + if hasattr(response, "render") and callable(response.render): response.add_post_render_callback( lambda r: self.cache.set(cache_key, r, timeout) diff --git a/tests/cache/tests.py b/tests/cache/tests.py index 978efdd9d3..6adc48fab8 100644 --- a/tests/cache/tests.py +++ b/tests/cache/tests.py @@ -2984,3 +2984,41 @@ class CacheHandlerTest(SimpleTestCase): # .all() initializes all caches. self.assertEqual(len(test_caches.all(initialized_only=True)), 2) self.assertEqual(test_caches.all(), test_caches.all(initialized_only=True)) + + +@override_settings( + CACHES={ + "default": {"BACKEND": "django.core.cache.backends.locmem.LocMemCache"}, + "other": { + "BACKEND": "django.core.cache.backends.locmem.LocMemCache", + "LOCATION": "other", + }, + }, +) +class DuplicateCacheKey(TestCase): + def test_cache_page_conflict(self): + """cache_page isn't causing duplicates with middlewares""" + + @cache_page(3000, cache="other") + def test_view(request): + return HttpResponse(b"Hello, world") + + request = RequestFactory().get("/view/") + cache_key = ( + "views.decorators.cache.cache_page..GET." + "5b30bdb36b35025daf3570b18c3bb916.d41d8cd98f00b204e9800998ecf8427e.en" + ) + + self.assertEqual(caches["default"].has_key(cache_key), False) + self.assertEqual(caches["other"].has_key(cache_key), False) + + UpdateCacheMiddleware(test_view)(request) + self.assertEqual(caches["other"].has_key(cache_key), True) + self.assertEqual(caches["default"].has_key(cache_key), False) + + CacheMiddleware(test_view)(request) + self.assertEqual(caches["other"].has_key(cache_key), True) + self.assertEqual(caches["default"].has_key(cache_key), False) + + response = test_view(request) + self.assertEqual(response.content, b"Hello, world")