Fixed #24360 -- Delayed internal LocaleMiddleware variable initialization

Failing in a middleware `__init__` is preventing proper debug view.
This commit is contained in:
Claude Paroz 2015-03-02 12:12:22 +01:00
parent fea45eff5a
commit 80be597a7b
1 changed files with 9 additions and 12 deletions

View File

@ -7,6 +7,7 @@ from django.core.urlresolvers import (
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
from django.utils import translation from django.utils import translation
from django.utils.cache import patch_vary_headers from django.utils.cache import patch_vary_headers
from django.utils.functional import cached_property
class LocaleMiddleware(object): class LocaleMiddleware(object):
@ -19,17 +20,9 @@ class LocaleMiddleware(object):
""" """
response_redirect_class = HttpResponseRedirect response_redirect_class = HttpResponseRedirect
def __init__(self):
self._is_language_prefix_patterns_used = False
for url_pattern in get_resolver(None).url_patterns:
if isinstance(url_pattern, LocaleRegexURLResolver):
self._is_language_prefix_patterns_used = True
break
def process_request(self, request): def process_request(self, request):
check_path = self.is_language_prefix_patterns_used()
language = translation.get_language_from_request( language = translation.get_language_from_request(
request, check_path=check_path) request, check_path=self.is_language_prefix_patterns_used)
translation.activate(language) translation.activate(language)
request.LANGUAGE_CODE = translation.get_language() request.LANGUAGE_CODE = translation.get_language()
@ -37,7 +30,7 @@ class LocaleMiddleware(object):
language = translation.get_language() language = translation.get_language()
language_from_path = translation.get_language_from_path(request.path_info) language_from_path = translation.get_language_from_path(request.path_info)
if (response.status_code == 404 and not language_from_path if (response.status_code == 404 and not language_from_path
and self.is_language_prefix_patterns_used()): and self.is_language_prefix_patterns_used):
urlconf = getattr(request, 'urlconf', None) urlconf = getattr(request, 'urlconf', None)
language_path = '/%s%s' % (language, request.path_info) language_path = '/%s%s' % (language, request.path_info)
path_valid = is_valid_path(language_path, urlconf) path_valid = is_valid_path(language_path, urlconf)
@ -60,16 +53,20 @@ class LocaleMiddleware(object):
) )
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
and language_from_path): and language_from_path):
patch_vary_headers(response, ('Accept-Language',)) patch_vary_headers(response, ('Accept-Language',))
if 'Content-Language' not in response: if 'Content-Language' not in response:
response['Content-Language'] = language response['Content-Language'] = language
return response return response
@cached_property
def is_language_prefix_patterns_used(self): def is_language_prefix_patterns_used(self):
""" """
Returns `True` if the `LocaleRegexURLResolver` is used Returns `True` if the `LocaleRegexURLResolver` is used
at root level of the urlpatterns, else it returns `False`. at root level of the urlpatterns, else it returns `False`.
""" """
return self._is_language_prefix_patterns_used for url_pattern in get_resolver(None).url_patterns:
if isinstance(url_pattern, LocaleRegexURLResolver):
return True
return False