summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--django/middleware/common.py7
-rw-r--r--docs/ref/middleware.txt8
-rw-r--r--docs/releases/1.8.txt7
-rw-r--r--tests/middleware/tests.py22
4 files changed, 42 insertions, 2 deletions
diff --git a/django/middleware/common.py b/django/middleware/common.py
index c719f9e9a3..0bf0481df6 100644
--- a/django/middleware/common.py
+++ b/django/middleware/common.py
@@ -30,11 +30,16 @@ class CommonMiddleware(object):
urlpatterns, then an HTTP-redirect is returned to this new URL;
otherwise the initial URL is processed as usual.
+ This behavior can be customized by subclassing CommonMiddleware and
+ overriding the response_redirect_class attribute.
+
- ETags: If the USE_ETAGS setting is set, ETags will be calculated from
the entire page content and Not Modified responses will be returned
appropriately.
"""
+ response_redirect_class = http.HttpResponsePermanentRedirect
+
def process_request(self, request):
"""
Check for denied User-Agents and rewrite the URL based on
@@ -100,7 +105,7 @@ class CommonMiddleware(object):
newurl += '?' + request.META['QUERY_STRING'].decode()
except UnicodeDecodeError:
pass
- return http.HttpResponsePermanentRedirect(newurl)
+ return self.response_redirect_class(newurl)
def process_response(self, request, response):
"""
diff --git a/docs/ref/middleware.txt b/docs/ref/middleware.txt
index 3ba7d52b9d..8f3f3094e9 100644
--- a/docs/ref/middleware.txt
+++ b/docs/ref/middleware.txt
@@ -66,6 +66,14 @@ Adds a few conveniences for perfectionists:
for each request by MD5-hashing the page content, and it'll take care of
sending ``Not Modified`` responses, if appropriate.
+.. attribute:: CommonMiddleware.response_redirect_class
+
+.. versionadded:: 1.8
+
+Defaults to :class:`~django.http.HttpResponsePermanentRedirect`. Subclass
+``CommonMiddleware`` and override the attribute to customize the redirects
+issued by the middleware.
+
.. class:: BrokenLinkEmailsMiddleware
* Sends broken link notification emails to :setting:`MANAGERS` (see
diff --git a/docs/releases/1.8.txt b/docs/releases/1.8.txt
index d5bae559a7..e1bca107df 100644
--- a/docs/releases/1.8.txt
+++ b/docs/releases/1.8.txt
@@ -304,6 +304,13 @@ Management Commands
:setting:`FIXTURE_DIRS` contains duplicates or a default fixture directory
path (``app_name/fixtures``), an exception is raised.
+Middleware
+^^^^^^^^^^
+
+* The :attr:`CommonMiddleware.response_redirect_class
+ <django.middleware.common.CommonMiddleware.response_redirect_class>`
+ attribute allows you to customize the redirects issued by the middleware.
+
Migrations
^^^^^^^^^^
diff --git a/tests/middleware/tests.py b/tests/middleware/tests.py
index ec7f7633ba..f0a89d719a 100644
--- a/tests/middleware/tests.py
+++ b/tests/middleware/tests.py
@@ -9,7 +9,10 @@ from unittest import skipIf
from django.conf import settings
from django.core import mail
-from django.http import HttpRequest, HttpResponse, StreamingHttpResponse
+from django.http import (
+ HttpRequest, HttpResponse, StreamingHttpResponse, HttpResponsePermanentRedirect,
+ HttpResponseRedirect,
+)
from django.middleware.clickjacking import XFrameOptionsMiddleware
from django.middleware.common import CommonMiddleware, BrokenLinkEmailsMiddleware
from django.middleware.http import ConditionalGetMiddleware
@@ -242,6 +245,23 @@ class CommonMiddlewareTest(TestCase):
response = CommonMiddleware().process_request(request)
self.assertEqual(response.status_code, 301)
+ def test_response_redirect_class(self):
+ request = self._get_request('slash')
+ r = CommonMiddleware().process_request(request)
+ self.assertEqual(r.status_code, 301)
+ self.assertEqual(r.url, 'http://testserver/slash/')
+ self.assertIsInstance(r, HttpResponsePermanentRedirect)
+
+ def test_response_redirect_class_subclass(self):
+ class MyCommonMiddleware(CommonMiddleware):
+ response_redirect_class = HttpResponseRedirect
+
+ request = self._get_request('slash')
+ r = MyCommonMiddleware().process_request(request)
+ self.assertEqual(r.status_code, 302)
+ self.assertEqual(r.url, 'http://testserver/slash/')
+ self.assertIsInstance(r, HttpResponseRedirect)
+
@override_settings(
IGNORABLE_404_URLS=(re.compile(r'foo'),),