Explorar o código

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

Thanks jordan at aace.org for the suggestion.
Christopher Medrela %!s(int64=11) %!d(string=hai) anos
pai
achega
b22d6c47a7

+ 10 - 0
django/contrib/sites/middleware.py

@@ -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()

+ 11 - 0
django/contrib/sites/tests.py

@@ -5,6 +5,7 @@ from django.core.exceptions import ObjectDoesNotExist, ValidationError
 from django.http import HttpRequest
 from django.test import TestCase, modify_settings, override_settings
 
+from .middleware import CurrentSiteMiddleware
 from .models import Site
 from .requests import RequestSite
 from .shortcuts import get_current_site
@@ -79,3 +80,13 @@ class SitesFrameworkTests(TestCase):
         self.assertRaises(ValidationError, site.full_clean)
         site.domain = "test\ntest"
         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)

+ 20 - 0
docs/ref/contrib/sites.txt

@@ -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
 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
 ===================================
 

+ 13 - 0
docs/ref/middleware.txt

@@ -179,6 +179,19 @@ Session middleware
 Enables session support. See the :doc:`session documentation
 </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
 -------------------------
 

+ 6 - 0
docs/releases/1.7.txt

@@ -358,6 +358,12 @@ Minor features
   :class:`~django.middleware.http.ConditionalGetMiddleware` to handle
   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`
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^