Refs #15902 -- Made set_language() view always set the current language in a cookie.
The plan is to later deprecate/remove storing the language in the session.
This commit is contained in:
parent
ccc25bfe4f
commit
b3cd9fb18b
|
@ -22,9 +22,9 @@ LANGUAGE_QUERY_PARAMETER = 'language'
|
|||
|
||||
def set_language(request):
|
||||
"""
|
||||
Redirect to a given URL while setting the chosen language in the session or
|
||||
cookie. The URL and the language code need to be specified in the request
|
||||
parameters.
|
||||
Redirect to a given URL while setting the chosen language in the session
|
||||
(if enabled) and in a cookie. The URL and the language code need to be
|
||||
specified in the request parameters.
|
||||
|
||||
Since this view changes how the user will see the rest of the site, it must
|
||||
only be accessed as a POST request. If called as a GET request, it will
|
||||
|
@ -49,13 +49,12 @@ def set_language(request):
|
|||
response = HttpResponseRedirect(next_trans)
|
||||
if hasattr(request, 'session'):
|
||||
request.session[LANGUAGE_SESSION_KEY] = lang_code
|
||||
else:
|
||||
response.set_cookie(
|
||||
settings.LANGUAGE_COOKIE_NAME, lang_code,
|
||||
max_age=settings.LANGUAGE_COOKIE_AGE,
|
||||
path=settings.LANGUAGE_COOKIE_PATH,
|
||||
domain=settings.LANGUAGE_COOKIE_DOMAIN,
|
||||
)
|
||||
response.set_cookie(
|
||||
settings.LANGUAGE_COOKIE_NAME, lang_code,
|
||||
max_age=settings.LANGUAGE_COOKIE_AGE,
|
||||
path=settings.LANGUAGE_COOKIE_PATH,
|
||||
domain=settings.LANGUAGE_COOKIE_DOMAIN,
|
||||
)
|
||||
return response
|
||||
|
||||
|
||||
|
|
|
@ -1761,10 +1761,14 @@ Activate this view by adding the following line to your URLconf::
|
|||
language-independent itself to work correctly.
|
||||
|
||||
The view expects to be called via the ``POST`` method, with a ``language``
|
||||
parameter set in request. If session support is enabled, the view
|
||||
saves the language choice in the user's session. Otherwise, it saves the
|
||||
language choice in a cookie that is by default named ``django_language``.
|
||||
(The name can be changed through the :setting:`LANGUAGE_COOKIE_NAME` setting.)
|
||||
parameter set in request. If session support is enabled, the view saves the
|
||||
language choice in the user's session. It also saves the language choice in a
|
||||
cookie that is named ``django_language`` by default. (The name can be changed
|
||||
through the :setting:`LANGUAGE_COOKIE_NAME` setting.)
|
||||
|
||||
.. versionchanged:: 2.1
|
||||
|
||||
In older versions, the cookie is only set if session support isn't enabled.
|
||||
|
||||
After setting the language choice, Django looks for a ``next`` parameter in the
|
||||
``POST`` or ``GET`` data. If that is found and Django considers it to be a safe
|
||||
|
|
|
@ -37,6 +37,12 @@ class SetLanguageTests(TestCase):
|
|||
response = self.client.post('/i18n/setlang/', post_data, HTTP_REFERER='/i_should_not_be_used/')
|
||||
self.assertRedirects(response, '/')
|
||||
self.assertEqual(self.client.session[LANGUAGE_SESSION_KEY], lang_code)
|
||||
# The language is set in a cookie.
|
||||
language_cookie = self.client.cookies[settings.LANGUAGE_COOKIE_NAME]
|
||||
self.assertEqual(language_cookie.value, lang_code)
|
||||
self.assertEqual(language_cookie['domain'], '')
|
||||
self.assertEqual(language_cookie['path'], '/')
|
||||
self.assertEqual(language_cookie['max-age'], '')
|
||||
|
||||
def test_setlang_unsafe_next(self):
|
||||
"""
|
||||
|
|
Loading…
Reference in New Issue