Author: mtredinnick
Date: 2007-09-14 03:37:09 -0500 (Fri, 14 Sep 2007)
New Revision: 6180

Modified:
   django/trunk/django/contrib/sites/models.py
   django/trunk/docs/sites.txt
Log:
Fixed #3766 -- Added in-memory caching for the sites framework. Will speed up 
all the "current site" lookups. Thanks, Matt Riggott.


Modified: django/trunk/django/contrib/sites/models.py
===================================================================
--- django/trunk/django/contrib/sites/models.py 2007-09-14 08:29:51 UTC (rev 
6179)
+++ django/trunk/django/contrib/sites/models.py 2007-09-14 08:37:09 UTC (rev 
6180)
@@ -2,16 +2,33 @@
 from django.utils.translation import ugettext_lazy as _
 from django.http import get_host
 
+SITE_CACHE = {}
+
 class SiteManager(models.Manager):
     def get_current(self):
+        """
+        Returns the current ``Site`` based on the SITE_ID in the
+        project's settings. The ``Site`` object is cached the first
+        time it's retrieved from the database.
+        """
         from django.conf import settings
         try:
             sid = settings.SITE_ID
         except AttributeError:
             from django.core.exceptions import ImproperlyConfigured
             raise ImproperlyConfigured("You're using the Django \"sites 
framework\" without having set the SITE_ID setting. Create a site in your 
database and set the SITE_ID setting to fix this error.")
-        return self.get(pk=sid)
+        try:
+            current_site = SITE_CACHE[sid]
+        except KeyError:
+            current_site = self.get(pk=sid)
+            SITE_CACHE[sid] = current_site
+        return current_site
 
+    def clear_cache(self):
+        """Clears the ``Site`` object cache."""
+        global SITE_CACHE
+        SITE_CACHE = {}
+
 class Site(models.Model):
     domain = models.CharField(_('domain name'), max_length=100)
     name = models.CharField(_('display name'), max_length=50)

Modified: django/trunk/docs/sites.txt
===================================================================
--- django/trunk/docs/sites.txt 2007-09-14 08:29:51 UTC (rev 6179)
+++ django/trunk/docs/sites.txt 2007-09-14 08:37:09 UTC (rev 6180)
@@ -213,6 +213,31 @@
     >>> 'http://%s%s' % (Site.objects.get_current().domain, 
obj.get_absolute_url())
     'http://example.com/mymodel/objects/3/'
 
+Caching the current ``Site`` object
+===================================
+
+**New in Django development version**
+
+As the current site is stored in the database, each call to
+``Site.objects.get_current()`` could result in a database query. But Django is 
a
+little cleverer than that: on the first request, the current site is cached, 
and
+any subsequent call returns the cached data instead of hitting the database.
+
+If for any reason you want to force a database query, you can tell Django to
+clear the cache using ``Site.objects.clear_cache()``::
+
+    # First call; current site fetched from database.
+    current_site = Site.objects.get_current()
+    # ...
+
+    # Second call; current site fetched from cache.
+    current_site = Site.objects.get_current()
+    # ...
+
+    # Force a database query for the third call.
+    Site.objects.clear_cache()
+    current_site = Site.objects.get_current()
+
 The ``CurrentSiteManager``
 ==========================
 


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to