Fix cache invalidation (#131)

This commit is contained in:
Thomas Güttler 2025-06-18 01:38:05 +02:00 committed by GitHub
parent 930ce5c65c
commit 10e7de2eda
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 28 additions and 4 deletions

View file

@ -1,6 +1,7 @@
import os import os
import shutil import shutil
import tempfile import tempfile
from unittest import mock
from django.conf import settings as django_settings from django.conf import settings as django_settings
from django.core.cache.backends.base import BaseCache from django.core.cache.backends.base import BaseCache
@ -151,3 +152,24 @@ class DbTemplatesTestCase(TestCase):
def test_get_cache_name(self): def test_get_cache_name(self):
self.assertEqual(get_cache_key('name with spaces'), self.assertEqual(get_cache_key('name with spaces'),
'dbtemplates::name-with-spaces::1') 'dbtemplates::name-with-spaces::1')
def test_cache_invalidation(self):
# Add t1 into the cache of site2
self.t1.sites.add(self.site2)
with mock.patch('django.contrib.sites.models.SiteManager.get_current',
return_value=self.site2):
result = loader.get_template("base.html").render()
self.assertEqual(result, 'base')
# Update content
self.t1.content = 'new content'
self.t1.save()
result = loader.get_template("base.html").render()
self.assertEqual(result, 'new content')
# Cache invalidation should work across sites.
# Site2 should see the new content.
with mock.patch('django.contrib.sites.models.SiteManager.get_current',
return_value=self.site2):
result = loader.get_template("base.html").render()
self.assertEqual(result, 'new content')

View file

@ -21,9 +21,10 @@ def get_cache_backend():
cache = get_cache_backend() cache = get_cache_backend()
def get_cache_key(name): def get_cache_key(name, site=None):
current_site = Site.objects.get_current() if site is None:
return f"dbtemplates::{slugify(name)}::{current_site.pk}" site = Site.objects.get_current()
return f"dbtemplates::{slugify(name)}::{site.pk}"
def get_cache_notfound_key(name): def get_cache_notfound_key(name):
@ -57,4 +58,5 @@ def remove_cached_template(instance, **kwargs):
Called via Django's signals to remove cached templates, if the template Called via Django's signals to remove cached templates, if the template
in the database was changed or deleted. in the database was changed or deleted.
""" """
cache.delete(get_cache_key(instance.name)) for site in instance.sites.all():
cache.delete(get_cache_key(instance.name, site=site))