Fixed #21579 -- Made LocaleMiddleware respect script prefix.

Thanks buettgenbach at datacollect.com for the report and patch.
This commit is contained in:
Tim Graham 2014-08-14 09:32:50 -04:00
parent cf79b57ad0
commit fe38be96c1
2 changed files with 33 additions and 5 deletions

View File

@ -1,7 +1,7 @@
"This is the locale selecting middleware that will look at accept headers" "This is the locale selecting middleware that will look at accept headers"
from django.conf import settings from django.conf import settings
from django.core.urlresolvers import (is_valid_path, get_resolver, from django.core.urlresolvers import (is_valid_path, get_resolver, get_script_prefix,
LocaleRegexURLResolver) LocaleRegexURLResolver)
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
from django.utils.cache import patch_vary_headers from django.utils.cache import patch_vary_headers
@ -45,9 +45,18 @@ class LocaleMiddleware(object):
path_valid = is_valid_path("%s/" % language_path, urlconf) path_valid = is_valid_path("%s/" % language_path, urlconf)
if path_valid: if path_valid:
language_url = "%s://%s/%s%s" % ( script_prefix = get_script_prefix()
request.scheme, request.get_host(), language, language_url = "%s://%s%s" % (
request.get_full_path()) request.scheme,
request.get_host(),
# insert language after the script prefix and before the
# rest of the URL
request.get_full_path().replace(
script_prefix,
'%s%s/' % (script_prefix, language),
1
)
)
return self.response_redirect_class(language_url) return self.response_redirect_class(language_url)
if not (self.is_language_prefix_patterns_used() if not (self.is_language_prefix_patterns_used()

View File

@ -3,7 +3,7 @@ from __future__ import unicode_literals
import os import os
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ImproperlyConfigured
from django.core.urlresolvers import reverse, clear_url_caches from django.core.urlresolvers import reverse, clear_url_caches, set_script_prefix
from django.http import HttpResponsePermanentRedirect from django.http import HttpResponsePermanentRedirect
from django.middleware.locale import LocaleMiddleware from django.middleware.locale import LocaleMiddleware
from django.test import TestCase, override_settings from django.test import TestCase, override_settings
@ -290,6 +290,25 @@ class URLResponseTests(URLTestCaseBase):
self.assertEqual(response.context['LANGUAGE_CODE'], 'pt-br') self.assertEqual(response.context['LANGUAGE_CODE'], 'pt-br')
class URLRedirectWithScriptAliasTests(URLTestCaseBase):
"""
#21579 - LocaleMiddleware should respect the script prefix.
"""
def setUp(self):
super(URLRedirectWithScriptAliasTests, self).setUp()
self.script_prefix = '/script_prefix'
set_script_prefix(self.script_prefix)
def tearDown(self):
super(URLRedirectWithScriptAliasTests, self).tearDown()
# reset script prefix
set_script_prefix('')
def test_language_prefix_with_script_prefix(self):
response = self.client.get('/prefixed/', HTTP_ACCEPT_LANGUAGE='en', SCRIPT_NAME=self.script_prefix)
self.assertRedirects(response, '%s/en/prefixed/' % self.script_prefix, target_status_code=404)
class URLTagTests(URLTestCaseBase): class URLTagTests(URLTestCaseBase):
""" """
Test if the language tag works. Test if the language tag works.