Invalidate the appropriate SITE_CACHE entry when saving a Site model.
This avoids the problem of, for example, saving a change to the Site model in the admin interface and then seeing the wrong instanec returned in the next call to get_current_site(). It's still possible to end up with an inconsistent cache if update() is used to change the Site model, but that's pretty unavoidable. It's also a slightly odd way to update a Site model, so if you really need to do that, you can manage to call SiteManager.clear() at the same time. git-svn-id: http://code.djangoproject.com/svn/django/trunk@9908 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
1306079a02
commit
0dd4ec654f
|
@ -42,11 +42,17 @@ class Site(models.Model):
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return self.domain
|
return self.domain
|
||||||
|
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
super(Site, self).save(*args, **kwargs)
|
||||||
|
# Cached information will likely be incorrect now.
|
||||||
|
if self.id in SITE_CACHE:
|
||||||
|
del SITE_CACHE[self.id]
|
||||||
|
|
||||||
def delete(self):
|
def delete(self):
|
||||||
pk = self.pk
|
pk = self.pk
|
||||||
super(Site, self).delete()
|
super(Site, self).delete()
|
||||||
try:
|
try:
|
||||||
del(SITE_CACHE[pk])
|
del SITE_CACHE[pk]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
>>> from django.conf import settings
|
>>> from django.conf import settings
|
||||||
>>> Site(id=settings.SITE_ID, domain="example.com", name="example.com").save()
|
>>> Site(id=settings.SITE_ID, domain="example.com", name="example.com").save()
|
||||||
|
|
||||||
>>> # Make sure that get_current() does not return a deleted Site object.
|
# Make sure that get_current() does not return a deleted Site object.
|
||||||
>>> s = Site.objects.get_current()
|
>>> s = Site.objects.get_current()
|
||||||
>>> isinstance(s, Site)
|
>>> isinstance(s, Site)
|
||||||
True
|
True
|
||||||
|
@ -13,4 +13,17 @@ True
|
||||||
Traceback (most recent call last):
|
Traceback (most recent call last):
|
||||||
...
|
...
|
||||||
DoesNotExist: Site matching query does not exist.
|
DoesNotExist: Site matching query does not exist.
|
||||||
|
|
||||||
|
# After updating a Site object (e.g. via the admin), we shouldn't return a
|
||||||
|
# bogus value from the SITE_CACHE.
|
||||||
|
>>> _ = Site.objects.create(id=settings.SITE_ID, domain="example.com", name="example.com")
|
||||||
|
>>> site = Site.objects.get_current()
|
||||||
|
>>> site.name
|
||||||
|
u"example.com"
|
||||||
|
>>> s2 = Site.objects.get(id=settings.SITE_ID)
|
||||||
|
>>> s2.name = "Example site"
|
||||||
|
>>> s2.save()
|
||||||
|
>>> site = Site.objects.get_current()
|
||||||
|
>>> site.name
|
||||||
|
u"Example site"
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Reference in New Issue