Kaydet (Commit) a8e2a9ba authored tarafından Claude Paroz's avatar Claude Paroz Kaydeden (comit) Tim Graham

Refs #15902 -- Deprecated storing user's language in the session.

üst 76990cbb
...@@ -7,7 +7,6 @@ from django.core.exceptions import ImproperlyConfigured, PermissionDenied ...@@ -7,7 +7,6 @@ from django.core.exceptions import ImproperlyConfigured, PermissionDenied
from django.middleware.csrf import rotate_token from django.middleware.csrf import rotate_token
from django.utils.crypto import constant_time_compare from django.utils.crypto import constant_time_compare
from django.utils.module_loading import import_string from django.utils.module_loading import import_string
from django.utils.translation import LANGUAGE_SESSION_KEY
from .signals import user_logged_in, user_logged_out, user_login_failed from .signals import user_logged_in, user_logged_out, user_login_failed
...@@ -143,15 +142,7 @@ def logout(request): ...@@ -143,15 +142,7 @@ def logout(request):
if not getattr(user, 'is_authenticated', True): if not getattr(user, 'is_authenticated', True):
user = None user = None
user_logged_out.send(sender=user.__class__, request=request, user=user) user_logged_out.send(sender=user.__class__, request=request, user=user)
# remember language choice saved to session
language = request.session.get(LANGUAGE_SESSION_KEY)
request.session.flush() request.session.flush()
if language is not None:
request.session[LANGUAGE_SESSION_KEY] = language
if hasattr(request, 'user'): if hasattr(request, 'user'):
from django.contrib.auth.models import AnonymousUser from django.contrib.auth.models import AnonymousUser
request.user = AnonymousUser() request.user = AnonymousUser()
......
import base64 import base64
import logging import logging
import string import string
import warnings
from datetime import datetime, timedelta from datetime import datetime, timedelta
from django.conf import settings from django.conf import settings
...@@ -10,7 +11,9 @@ from django.utils import timezone ...@@ -10,7 +11,9 @@ from django.utils import timezone
from django.utils.crypto import ( from django.utils.crypto import (
constant_time_compare, get_random_string, salted_hmac, constant_time_compare, get_random_string, salted_hmac,
) )
from django.utils.deprecation import RemovedInDjango40Warning
from django.utils.module_loading import import_string from django.utils.module_loading import import_string
from django.utils.translation import LANGUAGE_SESSION_KEY
# session_key should not be case sensitive because some backends can store it # session_key should not be case sensitive because some backends can store it
# on case insensitive file systems. # on case insensitive file systems.
...@@ -51,6 +54,13 @@ class SessionBase: ...@@ -51,6 +54,13 @@ class SessionBase:
return key in self._session return key in self._session
def __getitem__(self, key): def __getitem__(self, key):
if key == LANGUAGE_SESSION_KEY:
warnings.warn(
'The user language will no longer be stored in '
'request.session in Django 4.0. Read it from '
'request.COOKIES[settings.LANGUAGE_COOKIE_NAME] instead.',
RemovedInDjango40Warning, stacklevel=2,
)
return self._session[key] return self._session[key]
def __setitem__(self, key, value): def __setitem__(self, key, value):
......
...@@ -15,7 +15,7 @@ from django.core.signals import setting_changed ...@@ -15,7 +15,7 @@ from django.core.signals import setting_changed
from django.dispatch import receiver from django.dispatch import receiver
from django.utils.safestring import SafeData, mark_safe from django.utils.safestring import SafeData, mark_safe
from . import LANGUAGE_SESSION_KEY, to_language, to_locale from . import to_language, to_locale
# Translations are cached in a dictionary for every language. # Translations are cached in a dictionary for every language.
# The active translations are stored by threadid to make them thread local. # The active translations are stored by threadid to make them thread local.
...@@ -456,14 +456,9 @@ def get_language_from_request(request, check_path=False): ...@@ -456,14 +456,9 @@ def get_language_from_request(request, check_path=False):
if lang_code is not None: if lang_code is not None:
return lang_code return lang_code
supported_lang_codes = get_languages()
if hasattr(request, 'session'):
lang_code = request.session.get(LANGUAGE_SESSION_KEY)
if lang_code in supported_lang_codes and lang_code is not None and check_for_language(lang_code):
return lang_code
lang_code = request.COOKIES.get(settings.LANGUAGE_COOKIE_NAME) lang_code = request.COOKIES.get(settings.LANGUAGE_COOKIE_NAME)
if lang_code is not None and lang_code in get_languages() and check_for_language(lang_code):
return lang_code
try: try:
return get_supported_language_variant(lang_code) return get_supported_language_variant(lang_code)
......
...@@ -47,6 +47,8 @@ def set_language(request): ...@@ -47,6 +47,8 @@ def set_language(request):
if next_trans != next: if next_trans != next:
response = HttpResponseRedirect(next_trans) response = HttpResponseRedirect(next_trans)
if hasattr(request, 'session'): if hasattr(request, 'session'):
# Storing the language in the session is deprecated.
# (RemovedInDjango40Warning)
request.session[LANGUAGE_SESSION_KEY] = lang_code request.session[LANGUAGE_SESSION_KEY] = lang_code
response.set_cookie( response.set_cookie(
settings.LANGUAGE_COOKIE_NAME, lang_code, settings.LANGUAGE_COOKIE_NAME, lang_code,
......
...@@ -24,6 +24,9 @@ details on these changes. ...@@ -24,6 +24,9 @@ details on these changes.
``ugettext_noop()``, ``ungettext()``, and ``ungettext_lazy()`` will be ``ugettext_noop()``, ``ungettext()``, and ``ungettext_lazy()`` will be
removed. removed.
* ``django.views.i18n.set_language()`` will no longer set the user language in
``request.session`` (key ``django.utils.translation.LANGUAGE_SESSION_KEY``).
.. _deprecation-removed-in-3.1: .. _deprecation-removed-in-3.1:
3.1 3.1
......
...@@ -1106,3 +1106,8 @@ functions without the ``u``. ...@@ -1106,3 +1106,8 @@ functions without the ``u``.
Session key under which the active language for the current session is Session key under which the active language for the current session is
stored. stored.
.. deprecated:: 3.0
The language won't be stored in the session in Django 4.0. Use the
:setting:`LANGUAGE_COOKIE_NAME` cookie instead.
...@@ -302,6 +302,11 @@ Miscellaneous ...@@ -302,6 +302,11 @@ Miscellaneous
* ``ContentType.__str__()`` now includes the model's ``app_label`` to * ``ContentType.__str__()`` now includes the model's ``app_label`` to
disambiguate model's with the same name in different apps. disambiguate model's with the same name in different apps.
* Because accessing the language in the session rather than in the cookie is
deprecated, ``LocaleMiddleware`` no longer looks for the user's language in
the session and :func:`django.contrib.auth.logout` no longer preserves the
session's language after logout.
.. _deprecated-features-3.0: .. _deprecated-features-3.0:
Features deprecated in 3.0 Features deprecated in 3.0
...@@ -332,6 +337,11 @@ Miscellaneous ...@@ -332,6 +337,11 @@ Miscellaneous
:func:`~django.utils.translation.ngettext`, and :func:`~django.utils.translation.ngettext`, and
:func:`~django.utils.translation.ngettext_lazy`. :func:`~django.utils.translation.ngettext_lazy`.
* To limit creation of sessions and hence favor some caching strategies,
:func:`django.views.i18n.set_language` will stop setting the user's language
in the session in Django 4.0. Since Django 2.1, the language is always stored
in the :setting:`LANGUAGE_COOKIE_NAME` cookie.
.. _removed-features-3.0: .. _removed-features-3.0:
Features removed in 3.0 Features removed in 3.0
......
...@@ -1824,28 +1824,24 @@ You may want to set the active language for the current session explicitly. Perh ...@@ -1824,28 +1824,24 @@ You may want to set the active language for the current session explicitly. Perh
a user's language preference is retrieved from another system, for example. a user's language preference is retrieved from another system, for example.
You've already been introduced to :func:`django.utils.translation.activate()`. That You've already been introduced to :func:`django.utils.translation.activate()`. That
applies to the current thread only. To persist the language for the entire applies to the current thread only. To persist the language for the entire
session, also modify :data:`~django.utils.translation.LANGUAGE_SESSION_KEY` session in a cookie, set the :setting:`LANGUAGE_COOKIE_NAME` cookie on the
in the session:: response::
from django.conf import settings
from django.http import HttpResponse
from django.utils import translation from django.utils import translation
user_language = 'fr' user_language = 'fr'
translation.activate(user_language) translation.activate(user_language)
request.session[translation.LANGUAGE_SESSION_KEY] = user_language response = HttpResponse(...)
response.set_cookie(settings.LANGUAGE_COOKIE_NAME, user_language)
You would typically want to use both: :func:`django.utils.translation.activate()` You would typically want to use both: :func:`django.utils.translation.activate()`
will change the language for this thread, and modifying the session makes this changes the language for this thread, and setting the cookie makes this
preference persist in future requests. preference persist in future requests.
If you are not using sessions, the language will persist in a cookie, whose name .. versionchanged:: 3.0
is configured in :setting:`LANGUAGE_COOKIE_NAME`. For example::
from django.conf import settings In older versions, you could set the language in the current session.
from django.http import HttpResponse
from django.utils import translation
user_language = 'fr'
translation.activate(user_language)
response = HttpResponse(...)
response.set_cookie(settings.LANGUAGE_COOKIE_NAME, user_language)
Using translations outside views and templates Using translations outside views and templates
---------------------------------------------- ----------------------------------------------
...@@ -1980,9 +1976,6 @@ following this algorithm: ...@@ -1980,9 +1976,6 @@ following this algorithm:
root URLconf. See :ref:`url-internationalization` for more information root URLconf. See :ref:`url-internationalization` for more information
about the language prefix and how to internationalize URL patterns. about the language prefix and how to internationalize URL patterns.
* Failing that, it looks for the :data:`~django.utils.translation.LANGUAGE_SESSION_KEY`
key in the current user's session.
* Failing that, it looks for a cookie. * Failing that, it looks for a cookie.
The name of the cookie used is set by the :setting:`LANGUAGE_COOKIE_NAME` The name of the cookie used is set by the :setting:`LANGUAGE_COOKIE_NAME`
......
...@@ -31,7 +31,6 @@ from django.test import Client, TestCase, override_settings ...@@ -31,7 +31,6 @@ from django.test import Client, TestCase, override_settings
from django.test.client import RedirectCycleError from django.test.client import RedirectCycleError
from django.urls import NoReverseMatch, reverse, reverse_lazy from django.urls import NoReverseMatch, reverse, reverse_lazy
from django.utils.http import urlsafe_base64_encode from django.utils.http import urlsafe_base64_encode
from django.utils.translation import LANGUAGE_SESSION_KEY
from .client import PasswordResetConfirmClient from .client import PasswordResetConfirmClient
from .models import CustomUser, UUIDUser from .models import CustomUser, UUIDUser
...@@ -1075,16 +1074,12 @@ class LogoutTest(AuthViewsTestCase): ...@@ -1075,16 +1074,12 @@ class LogoutTest(AuthViewsTestCase):
self.confirm_logged_out() self.confirm_logged_out()
def test_logout_preserve_language(self): def test_logout_preserve_language(self):
"""Language stored in session is preserved after logout""" """Language is preserved after logout."""
# Create a new session with language self.login()
engine = import_module(settings.SESSION_ENGINE) self.client.post('/setlang/', {'language': 'pl'})
session = engine.SessionStore() self.assertEqual(self.client.cookies[settings.LANGUAGE_COOKIE_NAME].value, 'pl')
session[LANGUAGE_SESSION_KEY] = 'pl'
session.save()
self.client.cookies[settings.SESSION_COOKIE_NAME] = session.session_key
self.client.get('/logout/') self.client.get('/logout/')
self.assertEqual(self.client.session[LANGUAGE_SESSION_KEY], 'pl') self.assertEqual(self.client.cookies[settings.LANGUAGE_COOKIE_NAME].value, 'pl')
@override_settings(LOGOUT_REDIRECT_URL='/custom/') @override_settings(LOGOUT_REDIRECT_URL='/custom/')
def test_logout_redirect_url_setting(self): def test_logout_redirect_url_setting(self):
......
...@@ -9,6 +9,7 @@ from django.shortcuts import render ...@@ -9,6 +9,7 @@ from django.shortcuts import render
from django.template import RequestContext, Template from django.template import RequestContext, Template
from django.urls import path, re_path, reverse_lazy from django.urls import path, re_path, reverse_lazy
from django.views.decorators.cache import never_cache from django.views.decorators.cache import never_cache
from django.views.i18n import set_language
class CustomRequestAuthenticationForm(AuthenticationForm): class CustomRequestAuthenticationForm(AuthenticationForm):
...@@ -148,6 +149,7 @@ urlpatterns = auth_urlpatterns + [ ...@@ -148,6 +149,7 @@ urlpatterns = auth_urlpatterns + [
path('permission_required_exception/', permission_required_exception), path('permission_required_exception/', permission_required_exception),
path('login_and_permission_required_exception/', login_and_permission_required_exception), path('login_and_permission_required_exception/', login_and_permission_required_exception),
path('setlang/', set_language, name='set_language'),
# This line is only required to render the password reset with is_admin=True # This line is only required to render the password reset with is_admin=True
path('admin/', admin.site.urls), path('admin/', admin.site.urls),
] ]
...@@ -4,11 +4,12 @@ from os import path ...@@ -4,11 +4,12 @@ from os import path
from django.conf import settings from django.conf import settings
from django.test import ( from django.test import (
RequestFactory, SimpleTestCase, TestCase, modify_settings, RequestFactory, SimpleTestCase, TestCase, ignore_warnings, modify_settings,
override_settings, override_settings,
) )
from django.test.selenium import SeleniumTestCase from django.test.selenium import SeleniumTestCase
from django.urls import reverse from django.urls import reverse
from django.utils.deprecation import RemovedInDjango40Warning
from django.utils.translation import ( from django.utils.translation import (
LANGUAGE_SESSION_KEY, get_language, override, LANGUAGE_SESSION_KEY, get_language, override,
) )
...@@ -36,7 +37,8 @@ class SetLanguageTests(TestCase): ...@@ -36,7 +37,8 @@ class SetLanguageTests(TestCase):
post_data = {'language': lang_code, 'next': '/'} post_data = {'language': lang_code, 'next': '/'}
response = self.client.post('/i18n/setlang/', post_data, HTTP_REFERER='/i_should_not_be_used/') response = self.client.post('/i18n/setlang/', post_data, HTTP_REFERER='/i_should_not_be_used/')
self.assertRedirects(response, '/') self.assertRedirects(response, '/')
self.assertEqual(self.client.session[LANGUAGE_SESSION_KEY], lang_code) with ignore_warnings(category=RemovedInDjango40Warning):
self.assertEqual(self.client.session[LANGUAGE_SESSION_KEY], lang_code)
# The language is set in a cookie. # The language is set in a cookie.
language_cookie = self.client.cookies[settings.LANGUAGE_COOKIE_NAME] language_cookie = self.client.cookies[settings.LANGUAGE_COOKIE_NAME]
self.assertEqual(language_cookie.value, lang_code) self.assertEqual(language_cookie.value, lang_code)
...@@ -53,7 +55,9 @@ class SetLanguageTests(TestCase): ...@@ -53,7 +55,9 @@ class SetLanguageTests(TestCase):
post_data = {'language': lang_code, 'next': '//unsafe/redirection/'} post_data = {'language': lang_code, 'next': '//unsafe/redirection/'}
response = self.client.post('/i18n/setlang/', data=post_data) response = self.client.post('/i18n/setlang/', data=post_data)
self.assertEqual(response.url, '/') self.assertEqual(response.url, '/')
self.assertEqual(self.client.session[LANGUAGE_SESSION_KEY], lang_code) self.assertEqual(self.client.cookies[settings.LANGUAGE_COOKIE_NAME].value, lang_code)
with ignore_warnings(category=RemovedInDjango40Warning):
self.assertEqual(self.client.session[LANGUAGE_SESSION_KEY], lang_code)
def test_setlang_http_next(self): def test_setlang_http_next(self):
""" """
...@@ -66,11 +70,15 @@ class SetLanguageTests(TestCase): ...@@ -66,11 +70,15 @@ class SetLanguageTests(TestCase):
# Insecure URL in POST data. # Insecure URL in POST data.
response = self.client.post('/i18n/setlang/', data=post_data, secure=True) response = self.client.post('/i18n/setlang/', data=post_data, secure=True)
self.assertEqual(response.url, '/') self.assertEqual(response.url, '/')
self.assertEqual(self.client.session[LANGUAGE_SESSION_KEY], lang_code) self.assertEqual(self.client.cookies[settings.LANGUAGE_COOKIE_NAME].value, lang_code)
with ignore_warnings(category=RemovedInDjango40Warning):
self.assertEqual(self.client.session[LANGUAGE_SESSION_KEY], lang_code)
# Insecure URL in HTTP referer. # Insecure URL in HTTP referer.
response = self.client.post('/i18n/setlang/', secure=True, HTTP_REFERER=non_https_next_url) response = self.client.post('/i18n/setlang/', secure=True, HTTP_REFERER=non_https_next_url)
self.assertEqual(response.url, '/') self.assertEqual(response.url, '/')
self.assertEqual(self.client.session[LANGUAGE_SESSION_KEY], lang_code) self.assertEqual(self.client.cookies[settings.LANGUAGE_COOKIE_NAME].value, lang_code)
with ignore_warnings(category=RemovedInDjango40Warning):
self.assertEqual(self.client.session[LANGUAGE_SESSION_KEY], lang_code)
def test_setlang_redirect_to_referer(self): def test_setlang_redirect_to_referer(self):
""" """
...@@ -81,7 +89,9 @@ class SetLanguageTests(TestCase): ...@@ -81,7 +89,9 @@ class SetLanguageTests(TestCase):
post_data = {'language': lang_code} post_data = {'language': lang_code}
response = self.client.post('/i18n/setlang/', post_data, HTTP_REFERER='/i18n/') response = self.client.post('/i18n/setlang/', post_data, HTTP_REFERER='/i18n/')
self.assertRedirects(response, '/i18n/', fetch_redirect_response=False) self.assertRedirects(response, '/i18n/', fetch_redirect_response=False)
self.assertEqual(self.client.session[LANGUAGE_SESSION_KEY], lang_code) self.assertEqual(self.client.cookies[settings.LANGUAGE_COOKIE_NAME].value, lang_code)
with ignore_warnings(category=RemovedInDjango40Warning):
self.assertEqual(self.client.session[LANGUAGE_SESSION_KEY], lang_code)
def test_setlang_default_redirect(self): def test_setlang_default_redirect(self):
""" """
...@@ -92,7 +102,9 @@ class SetLanguageTests(TestCase): ...@@ -92,7 +102,9 @@ class SetLanguageTests(TestCase):
post_data = {'language': lang_code} post_data = {'language': lang_code}
response = self.client.post('/i18n/setlang/', post_data) response = self.client.post('/i18n/setlang/', post_data)
self.assertRedirects(response, '/') self.assertRedirects(response, '/')
self.assertEqual(self.client.session[LANGUAGE_SESSION_KEY], lang_code) self.assertEqual(self.client.cookies[settings.LANGUAGE_COOKIE_NAME].value, lang_code)
with ignore_warnings(category=RemovedInDjango40Warning):
self.assertEqual(self.client.session[LANGUAGE_SESSION_KEY], lang_code)
def test_setlang_performs_redirect_for_ajax_if_explicitly_requested(self): def test_setlang_performs_redirect_for_ajax_if_explicitly_requested(self):
""" """
...@@ -102,7 +114,9 @@ class SetLanguageTests(TestCase): ...@@ -102,7 +114,9 @@ class SetLanguageTests(TestCase):
post_data = {'language': lang_code, 'next': '/'} post_data = {'language': lang_code, 'next': '/'}
response = self.client.post('/i18n/setlang/', post_data, HTTP_X_REQUESTED_WITH='XMLHttpRequest') response = self.client.post('/i18n/setlang/', post_data, HTTP_X_REQUESTED_WITH='XMLHttpRequest')
self.assertRedirects(response, '/') self.assertRedirects(response, '/')
self.assertEqual(self.client.session[LANGUAGE_SESSION_KEY], lang_code) self.assertEqual(self.client.cookies[settings.LANGUAGE_COOKIE_NAME].value, lang_code)
with ignore_warnings(category=RemovedInDjango40Warning):
self.assertEqual(self.client.session[LANGUAGE_SESSION_KEY], lang_code)
def test_setlang_doesnt_perform_a_redirect_to_referer_for_ajax(self): def test_setlang_doesnt_perform_a_redirect_to_referer_for_ajax(self):
""" """
...@@ -114,7 +128,9 @@ class SetLanguageTests(TestCase): ...@@ -114,7 +128,9 @@ class SetLanguageTests(TestCase):
headers = {'HTTP_REFERER': '/', 'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'} headers = {'HTTP_REFERER': '/', 'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'}
response = self.client.post('/i18n/setlang/', post_data, **headers) response = self.client.post('/i18n/setlang/', post_data, **headers)
self.assertEqual(response.status_code, 204) self.assertEqual(response.status_code, 204)
self.assertEqual(self.client.session[LANGUAGE_SESSION_KEY], lang_code) self.assertEqual(self.client.cookies[settings.LANGUAGE_COOKIE_NAME].value, lang_code)
with ignore_warnings(category=RemovedInDjango40Warning):
self.assertEqual(self.client.session[LANGUAGE_SESSION_KEY], lang_code)
def test_setlang_doesnt_perform_a_default_redirect_for_ajax(self): def test_setlang_doesnt_perform_a_default_redirect_for_ajax(self):
""" """
...@@ -124,7 +140,9 @@ class SetLanguageTests(TestCase): ...@@ -124,7 +140,9 @@ class SetLanguageTests(TestCase):
post_data = {'language': lang_code} post_data = {'language': lang_code}
response = self.client.post('/i18n/setlang/', post_data, HTTP_X_REQUESTED_WITH='XMLHttpRequest') response = self.client.post('/i18n/setlang/', post_data, HTTP_X_REQUESTED_WITH='XMLHttpRequest')
self.assertEqual(response.status_code, 204) self.assertEqual(response.status_code, 204)
self.assertEqual(self.client.session[LANGUAGE_SESSION_KEY], lang_code) self.assertEqual(self.client.cookies[settings.LANGUAGE_COOKIE_NAME].value, lang_code)
with ignore_warnings(category=RemovedInDjango40Warning):
self.assertEqual(self.client.session[LANGUAGE_SESSION_KEY], lang_code)
def test_setlang_unsafe_next_for_ajax(self): def test_setlang_unsafe_next_for_ajax(self):
""" """
...@@ -134,7 +152,16 @@ class SetLanguageTests(TestCase): ...@@ -134,7 +152,16 @@ class SetLanguageTests(TestCase):
post_data = {'language': lang_code, 'next': '//unsafe/redirection/'} post_data = {'language': lang_code, 'next': '//unsafe/redirection/'}
response = self.client.post('/i18n/setlang/', post_data, HTTP_X_REQUESTED_WITH='XMLHttpRequest') response = self.client.post('/i18n/setlang/', post_data, HTTP_X_REQUESTED_WITH='XMLHttpRequest')
self.assertEqual(response.url, '/') self.assertEqual(response.url, '/')
self.assertEqual(self.client.session[LANGUAGE_SESSION_KEY], lang_code) self.assertEqual(self.client.cookies[settings.LANGUAGE_COOKIE_NAME].value, lang_code)
def test_session_langauge_deprecation(self):
msg = (
'The user language will no longer be stored in request.session '
'in Django 4.0. Read it from '
'request.COOKIES[settings.LANGUAGE_COOKIE_NAME] instead.'
)
with self.assertRaisesMessage(RemovedInDjango40Warning, msg):
self.client.session[LANGUAGE_SESSION_KEY]
def test_setlang_reversal(self): def test_setlang_reversal(self):
self.assertEqual(reverse('set_language'), '/i18n/setlang/') self.assertEqual(reverse('set_language'), '/i18n/setlang/')
...@@ -168,7 +195,9 @@ class SetLanguageTests(TestCase): ...@@ -168,7 +195,9 @@ class SetLanguageTests(TestCase):
encoded_url = '/test-setlang/%C3%A4/' # (%C3%A4 decodes to ä) encoded_url = '/test-setlang/%C3%A4/' # (%C3%A4 decodes to ä)
response = self.client.post('/i18n/setlang/', {'language': lang_code}, HTTP_REFERER=encoded_url) response = self.client.post('/i18n/setlang/', {'language': lang_code}, HTTP_REFERER=encoded_url)
self.assertRedirects(response, encoded_url, fetch_redirect_response=False) self.assertRedirects(response, encoded_url, fetch_redirect_response=False)
self.assertEqual(self.client.session[LANGUAGE_SESSION_KEY], lang_code) self.assertEqual(self.client.cookies[settings.LANGUAGE_COOKIE_NAME].value, lang_code)
with ignore_warnings(category=RemovedInDjango40Warning):
self.assertEqual(self.client.session[LANGUAGE_SESSION_KEY], lang_code)
@modify_settings(MIDDLEWARE={ @modify_settings(MIDDLEWARE={
'append': 'django.middleware.locale.LocaleMiddleware', 'append': 'django.middleware.locale.LocaleMiddleware',
...@@ -178,7 +207,9 @@ class SetLanguageTests(TestCase): ...@@ -178,7 +207,9 @@ class SetLanguageTests(TestCase):
'/i18n/setlang/', data={'language': 'nl'}, '/i18n/setlang/', data={'language': 'nl'},
follow=True, HTTP_REFERER='/en/translated/' follow=True, HTTP_REFERER='/en/translated/'
) )
self.assertEqual(self.client.session[LANGUAGE_SESSION_KEY], 'nl') self.assertEqual(self.client.cookies[settings.LANGUAGE_COOKIE_NAME].value, 'nl')
with ignore_warnings(category=RemovedInDjango40Warning):
self.assertEqual(self.client.session[LANGUAGE_SESSION_KEY], 'nl')
self.assertRedirects(response, '/nl/vertaald/') self.assertRedirects(response, '/nl/vertaald/')
# And reverse # And reverse
response = self.client.post( response = self.client.post(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment