Fixed #17005 -- Added CurrentSiteMiddleware to set the current site on each request.

Thanks jordan at aace.org for the suggestion.
This commit is contained in:
Christopher Medrela 2013-11-18 21:16:09 +01:00 committed by Tim Graham
parent c43c469a2e
commit b22d6c47a7
5 changed files with 60 additions and 0 deletions

View File

@ -0,0 +1,10 @@
from .models import Site
class CurrentSiteMiddleware(object):
"""
Middleware that sets `site` attribute to request object.
"""
def process_request(self, request):
request.site = Site.objects.get_current()

View File

@ -5,6 +5,7 @@ from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.http import HttpRequest from django.http import HttpRequest
from django.test import TestCase, modify_settings, override_settings from django.test import TestCase, modify_settings, override_settings
from .middleware import CurrentSiteMiddleware
from .models import Site from .models import Site
from .requests import RequestSite from .requests import RequestSite
from .shortcuts import get_current_site from .shortcuts import get_current_site
@ -79,3 +80,13 @@ class SitesFrameworkTests(TestCase):
self.assertRaises(ValidationError, site.full_clean) self.assertRaises(ValidationError, site.full_clean)
site.domain = "test\ntest" site.domain = "test\ntest"
self.assertRaises(ValidationError, site.full_clean) self.assertRaises(ValidationError, site.full_clean)
class MiddlewareTest(TestCase):
def test_request(self):
""" Makes sure that the request has correct `site` attribute. """
middleware = CurrentSiteMiddleware()
request = HttpRequest()
middleware.process_request(request)
self.assertEqual(request.site.id, settings.SITE_ID)

View File

@ -373,6 +373,26 @@ your admin site to have access to all objects (not just site-specific
ones), put ``objects = models.Manager()`` in your model, before you ones), put ``objects = models.Manager()`` in your model, before you
define :class:`~django.contrib.sites.managers.CurrentSiteManager`. define :class:`~django.contrib.sites.managers.CurrentSiteManager`.
.. _site-middleware:
Site middleware
===============
.. versionadded:: 1.7
If you often use this pattern::
from django.contrib.sites.models import Site
def my_view(request):
site = Site.objects.get_current()
...
there is simple way to avoid repetitions. Add
:class:`django.contrib.site.middleware.CurrentSiteMiddleware` to
:setting:`MIDDLEWARE_CLASSES`. The middleware sets the ``site`` attribute on
every request object, so you can use ``request.site`` to get the current site.
How Django uses the sites framework How Django uses the sites framework
=================================== ===================================

View File

@ -179,6 +179,19 @@ Session middleware
Enables session support. See the :doc:`session documentation Enables session support. See the :doc:`session documentation
</topics/http/sessions>`. </topics/http/sessions>`.
Site middleware
---------------
.. module:: django.contrib.site.middleware
:synopsis: Site middleware.
.. class:: CurrentSiteMiddleware
.. versionadded:: 1.7
Adds the ``site`` attribute representing the current site to every incoming
``HttpRequest`` object. See the :ref:`sites documentation <site-middleware>`.
Authentication middleware Authentication middleware
------------------------- -------------------------

View File

@ -358,6 +358,12 @@ Minor features
:class:`~django.middleware.http.ConditionalGetMiddleware` to handle :class:`~django.middleware.http.ConditionalGetMiddleware` to handle
conditional ``GET`` requests for sitemaps which set ``lastmod``. conditional ``GET`` requests for sitemaps which set ``lastmod``.
:mod:`django.contrib.sites`
^^^^^^^^^^^^^^^^^^^^^^^^^^^
* The new :class:`django.contrib.site.middleware.CurrentSiteMiddleware` allows
setting the current site on each request.
:mod:`django.contrib.staticfiles` :mod:`django.contrib.staticfiles`
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^