mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	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:
		| @@ -41,12 +41,18 @@ 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" | ||||||
| """ | """ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user