From 951d78a5d2433347971eff73ef4d54de82e75db2 Mon Sep 17 00:00:00 2001 From: Ramiro Juan Nocelli Date: Tue, 14 Oct 2025 00:49:07 +0200 Subject: [PATCH] add test for response with Vary headers case --- django/utils/cache.py | 14 ++++++++------ tests/cache/tests.py | 42 ++++++++++++++++++++++++++++++++++++++---- 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/django/utils/cache.py b/django/utils/cache.py index b9308fc03c..d5c8720e98 100644 --- a/django/utils/cache.py +++ b/django/utils/cache.py @@ -20,7 +20,7 @@ from collections import defaultdict from hashlib import md5 from django.conf import settings -from django.core.cache import cache, caches +from django.core.cache import caches from django.http import HttpResponse, HttpResponseNotModified from django.test import RequestFactory from django.utils.http import http_date, parse_etags, parse_http_date_safe, quote_etag @@ -449,10 +449,7 @@ def _to_tuple(s): def invalidate_view_cache( - path=None, - request=None, - vary_headers=None, - key_prefix=None, + path=None, request=None, vary_headers=None, key_prefix=None, cache=None ): """ This function first creates a fake WSGIRequest to compute the cache key. @@ -479,7 +476,12 @@ def invalidate_view_cache( if vary_headers: request.META.update(vary_headers) - cache_key = get_cache_key(request, key_prefix=key_prefix, ignore_headers=True) + if cache is None: + cache = caches[settings.CACHE_MIDDLEWARE_ALIAS] + + cache_key = get_cache_key( + request, key_prefix=key_prefix, ignore_headers=True, cache=cache + ) if cache_key is None: return 0 diff --git a/tests/cache/tests.py b/tests/cache/tests.py index 1b20a3db0d..b10940ff72 100644 --- a/tests/cache/tests.py +++ b/tests/cache/tests.py @@ -63,6 +63,7 @@ from django.utils.cache import ( patch_vary_headers, ) from django.views.decorators.cache import cache_control, cache_page +from django.views.decorators.vary import vary_on_headers from .models import Poll, expensive_calculation @@ -2631,14 +2632,16 @@ class CacheMiddlewareTest(SimpleTestCase): view = cache_page(10)(hello_world_view) request = self.factory.get("/view/") _ = view(request, "0") - cache_key = get_cache_key(request=request, key_prefix="", ignore_headers=True) + cache_key = get_cache_key( + request=request, key_prefix="", ignore_headers=True, cache=cache + ) cached_response = cache.get(cache_key) # Verify request.content has been chached self.assertEqual(cached_response.content, b"Hello World 0") # Delete cache key/value - invalidate_view_cache(request=request, key_prefix="") + invalidate_view_cache(request=request, key_prefix="", cache=cache) cached_response = cache.get(cache_key) # Confirm key/value has been deleted from cache @@ -2650,14 +2653,45 @@ class CacheMiddlewareTest(SimpleTestCase): path = "/view/" request = self.factory.get(path) _ = view(request, "0") - cache_key = get_cache_key(request=request, key_prefix="", ignore_headers=True) + cache_key = get_cache_key( + request=request, key_prefix="", ignore_headers=True, cache=cache + ) cached_response = cache.get(cache_key) # Verify request.content has been chached self.assertEqual(cached_response.content, b"Hello World 0") # Delete cache key/value - invalidate_view_cache(path=path, key_prefix="") + invalidate_view_cache(path=path, key_prefix="", cache=cache) + cached_response = cache.get(cache_key) + + # Confirm key/value has been deleted from cache + self.assertIsNone(cached_response) + + def test_invalidate_view_decorator_cache_from_path_with_vary_headers(self): + """Invalidate cache key/value from path with Vary headers""" + + # Cache view and inject Vary headers to Response object + view = cache_page(10, key_prefix="")( + vary_on_headers("Accept-Encoding")(hello_world_view) + ) + path = "/view/" + request = self.factory.get(path) + response = view(request, "0") + + # Check response headers + self.assertTrue(response.has_header("Vary")) + + cache_key = get_cache_key( + request=request, key_prefix="", ignore_headers=False, cache=cache + ) + cached_response = cache.get(cache_key) + + # Verify request.content has been chached + self.assertEqual(cached_response.content, b"Hello World 0") + + # Delete cache key/value + invalidate_view_cache(path=path, key_prefix="", cache=cache) cached_response = cache.get(cache_key) # Confirm key/value has been deleted from cache