Quellcode durchsuchen

Fixed #19277 -- Added LocaleMiddleware.response_redirect_class

Thanks ppetrid at yawd.eu for the suggestion.
Emil Stenström vor 12 Jahren
Ursprung
Commit
7a97df190c
4 geänderte Dateien mit 30 neuen und 1 gelöschten Zeilen
  1. 2 1
      django/middleware/locale.py
  2. 6 0
      docs/ref/middleware.txt
  3. 6 0
      docs/releases/1.7.txt
  4. 16 0
      tests/i18n/patterns/tests.py

+ 2 - 1
django/middleware/locale.py

@@ -18,6 +18,7 @@ class LocaleMiddleware(object):
     translated to the language the user desires (if the language
     is available, of course).
     """
+    response_redirect_class = HttpResponseRedirect
 
     def __init__(self):
         self._supported_languages = OrderedDict(settings.LANGUAGES)
@@ -52,7 +53,7 @@ class LocaleMiddleware(object):
                 language_url = "%s://%s/%s%s" % (
                     'https' if request.is_secure() else 'http',
                     request.get_host(), language, request.get_full_path())
-                return HttpResponseRedirect(language_url)
+                return self.response_redirect_class(language_url)
 
         # Store language back into session if it is not present
         if hasattr(request, 'session'):

+ 6 - 0
docs/ref/middleware.txt

@@ -151,6 +151,12 @@ Enables language selection based on data from the request. It customizes
 content for each user. See the :doc:`internationalization documentation
 </topics/i18n/translation>`.
 
+.. attribute:: LocaleMiddleware.response_redirect_class
+
+Defaults to :class:`~django.http.HttpResponseRedirect`. Subclass
+``LocaleMiddleware`` and override the attribute to customize the redirects
+issued by the middleware.
+
 Message middleware
 ------------------
 

+ 6 - 0
docs/releases/1.7.txt

@@ -267,6 +267,12 @@ Forms
   :func:`~django.forms.formsets.formset_factory` to allow validating
   a minimum number of submitted forms.
 
+Internationalization
+^^^^^^^^^^^^^^^^^^^^
+
+* The :attr:`django.middleware.locale.LocaleMiddleware.response_redirect_class`
+  attribute allows you to customize the redirects issued by the middleware.
+
 Management Commands
 ^^^^^^^^^^^^^^^^^^^
 

+ 16 - 0
tests/i18n/patterns/tests.py

@@ -4,6 +4,8 @@ import os
 
 from django.core.exceptions import ImproperlyConfigured
 from django.core.urlresolvers import reverse, clear_url_caches
+from django.http import HttpResponsePermanentRedirect
+from django.middleware.locale import LocaleMiddleware
 from django.test import TestCase
 from django.test.utils import override_settings
 from django.template import Template, Context
@@ -11,6 +13,10 @@ from django.utils._os import upath
 from django.utils import translation
 
 
+class PermanentRedirectLocaleMiddleWare(LocaleMiddleware):
+    response_redirect_class = HttpResponsePermanentRedirect
+
+
 @override_settings(
     USE_I18N=True,
     LOCALE_PATHS=(
@@ -181,6 +187,16 @@ class URLRedirectTests(URLTestCaseBase):
         response = self.client.get(response['location'])
         self.assertEqual(response.status_code, 200)
 
+    @override_settings(
+        MIDDLEWARE_CLASSES=(
+            'i18n.patterns.tests.PermanentRedirectLocaleMiddleWare',
+            'django.middleware.common.CommonMiddleware',
+        ),
+    )
+    def test_custom_redirect_class(self):
+        response = self.client.get('/account/register/', HTTP_ACCEPT_LANGUAGE='en')
+        self.assertRedirects(response, '/en/account/register/', 301)
+
 
 class URLVaryAcceptLanguageTests(URLTestCaseBase):
     """