Skip to content

Commit

Permalink
Fixed #3766 -- Added in-memory caching for the sites framework. Will …
Browse files Browse the repository at this point in the history
…speed up all the "current site" lookups. Thanks, Matt Riggott.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@6180 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
malcolmt committed Sep 14, 2007
1 parent bc21612 commit 36396fb
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 1 deletion.
19 changes: 18 additions & 1 deletion django/contrib/sites/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,32 @@
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)
Expand Down
25 changes: 25 additions & 0 deletions docs/sites.txt
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,31 @@ To do this, you can use the sites framework. A simple example::
>>> '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``
==========================

Expand Down

0 comments on commit 36396fb

Please sign in to comment.