Fixed #23531 -- Added CommonMiddleware.response_redirect_class.

This commit is contained in:
Berker Peksag 2014-11-04 22:19:10 +02:00 committed by Tim Graham
parent 83daf53636
commit df0523debc
4 changed files with 42 additions and 2 deletions

View File

@ -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):
"""

View File

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

View File

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

View File

@ -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'),),