From d720fcfa507931b1d8123cef42c493d20b433b4c Mon Sep 17 00:00:00 2001 From: Oliver Falk Date: Thu, 11 Sep 2025 19:54:40 +0200 Subject: [PATCH 1/5] Rename the custom middleware to ensure it's know this is a localemiddleware. Also ensure we delete the Vary header, it could be empty - still problematic --- config.py | 2 +- ivatar/middleware.py | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/config.py b/config.py index 56c44e7..1cd2228 100644 --- a/config.py +++ b/config.py @@ -31,7 +31,7 @@ INSTALLED_APPS.extend( MIDDLEWARE.extend( [ - "ivatar.middleware.RemoveVaryForImagesMiddleware", + "ivatar.middleware.CustomLocaleMiddleware", ] ) MIDDLEWARE.insert( diff --git a/ivatar/middleware.py b/ivatar/middleware.py index d3e51bc..f610adf 100644 --- a/ivatar/middleware.py +++ b/ivatar/middleware.py @@ -7,7 +7,7 @@ from django.utils.deprecation import MiddlewareMixin from django.middleware.locale import LocaleMiddleware -class RemoveVaryForImagesMiddleware(LocaleMiddleware): +class CustomLocaleMiddleware(LocaleMiddleware): """ Middleware that extends LocaleMiddleware to skip Vary header processing for image URLs """ @@ -19,6 +19,11 @@ class RemoveVaryForImagesMiddleware(LocaleMiddleware): path.startswith(prefix) for prefix in ["/avatar/", "/gravatarproxy/", "/blueskyproxy/"] ): + # Debug print + print(f"DEBUG: Processing image URL: {path}") + # Delete Vary from header if exists + if "Vary" in response: + del response["Vary"] # Skip the parent's process_response to avoid adding Accept-Language to Vary return response From 52576bbf1893d74a70cc6bf4eba54b8ec7e09f42 Mon Sep 17 00:00:00 2001 From: Oliver Falk Date: Thu, 11 Sep 2025 20:00:47 +0200 Subject: [PATCH 2/5] Remove the debug print --- ivatar/middleware.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/ivatar/middleware.py b/ivatar/middleware.py index f610adf..871dacc 100644 --- a/ivatar/middleware.py +++ b/ivatar/middleware.py @@ -19,8 +19,6 @@ class CustomLocaleMiddleware(LocaleMiddleware): path.startswith(prefix) for prefix in ["/avatar/", "/gravatarproxy/", "/blueskyproxy/"] ): - # Debug print - print(f"DEBUG: Processing image URL: {path}") # Delete Vary from header if exists if "Vary" in response: del response["Vary"] From 9d390a5b19441242d7acd26411ab08984f4e37af Mon Sep 17 00:00:00 2001 From: Oliver Falk Date: Thu, 11 Sep 2025 20:07:24 +0200 Subject: [PATCH 3/5] Add last modified and etag for better caching --- ivatar/middleware.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ivatar/middleware.py b/ivatar/middleware.py index 871dacc..d4480d2 100644 --- a/ivatar/middleware.py +++ b/ivatar/middleware.py @@ -22,6 +22,9 @@ class CustomLocaleMiddleware(LocaleMiddleware): # Delete Vary from header if exists if "Vary" in response: del response["Vary"] + + response["Last-Modified"] = "Thu, 01 Jan 2025 00:00:00 GMT" + response["ETag"] = f'"{hash(response.content)}"' # Skip the parent's process_response to avoid adding Accept-Language to Vary return response From 7a1e38ab50b52ce3766e6db170df6bb46fe5a736 Mon Sep 17 00:00:00 2001 From: Oliver Falk Date: Fri, 12 Sep 2025 11:49:34 +0200 Subject: [PATCH 4/5] Use the hash value from the URL instead, less compute intense and more reliable --- ivatar/middleware.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/ivatar/middleware.py b/ivatar/middleware.py index d4480d2..ed1017e 100644 --- a/ivatar/middleware.py +++ b/ivatar/middleware.py @@ -23,8 +23,16 @@ class CustomLocaleMiddleware(LocaleMiddleware): if "Vary" in response: del response["Vary"] - response["Last-Modified"] = "Thu, 01 Jan 2025 00:00:00 GMT" - response["ETag"] = f'"{hash(response.content)}"' + # Extract hash from URL path for ETag + # URLs are like /avatar/{hash}, /gravatarproxy/{hash}, /blueskyproxy/{hash} + path_parts = path.strip("/").split("/") + if len(path_parts) >= 2: + hash_value = path_parts[1] # Get the hash part + response["Etag"] = f'"{hash_value}"' + else: + # Fallback to content hash if we can't extract from URL + response["Etag"] = f'"{hash(response.content)}"' + # Skip the parent's process_response to avoid adding Accept-Language to Vary return response From f7d72c18fb02db48a896b9a2069bca7d917dc6e8 Mon Sep 17 00:00:00 2001 From: Oliver Falk Date: Sat, 13 Sep 2025 18:20:22 +0200 Subject: [PATCH 5/5] This is creating a lot of noise and caching now anyway happens more on Apache side - use debug logging --- ivatar/ivataraccount/models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ivatar/ivataraccount/models.py b/ivatar/ivataraccount/models.py index ca3455e..a2c4531 100644 --- a/ivatar/ivataraccount/models.py +++ b/ivatar/ivataraccount/models.py @@ -375,9 +375,9 @@ class ConfirmedEmail(BaseAccountModel): cache_key = f"views.decorators.cache.cache_page.{quote(str(cache_url))}" if cache.has_key(cache_key): cache.delete(cache_key) - logger.error("Successfully cleaned up cached page: %s" % cache_key) + logger.debug("Successfully cleaned up cached page: %s" % cache_key) else: - logger.error("Page %s wasn't cached.", cache_key) + logger.debug("Page %s wasn't cached.", cache_key) return super().save(force_insert, force_update, using, update_fields)