Skip to content

Commit

Permalink
Fixed #12405 -- Added LOGOUT_REDIRECT_URL setting.
Browse files Browse the repository at this point in the history
After a user logs out via auth.views.logout(), they're redirected
to LOGOUT_REDIRECT_URL if no `next_page` argument is provided.
  • Loading branch information
Hugo Osvaldo Barrera authored and timgraham committed Feb 4, 2016
1 parent ad21638 commit dcee1df
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 1 deletion.
2 changes: 2 additions & 0 deletions django/conf/global_settings.py
Expand Up @@ -489,6 +489,8 @@ def gettext_noop(s):

LOGIN_REDIRECT_URL = '/accounts/profile/'

LOGOUT_REDIRECT_URL = None

# The number of days a password reset link is valid for
PASSWORD_RESET_TIMEOUT_DAYS = 3

Expand Down
2 changes: 2 additions & 0 deletions django/contrib/auth/views.py
Expand Up @@ -104,6 +104,8 @@ def logout(request, next_page=None,

if next_page is not None:
next_page = resolve_url(next_page)
elif settings.LOGOUT_REDIRECT_URL:
next_page = resolve_url(settings.LOGOUT_REDIRECT_URL)

if (redirect_field_name in request.POST or
redirect_field_name in request.GET):
Expand Down
20 changes: 20 additions & 0 deletions docs/ref/settings.txt
Expand Up @@ -2642,6 +2642,26 @@ This setting also accepts view function names and :ref:`named URL patterns
<naming-url-patterns>` which can be used to reduce configuration duplication
since you don't have to define the URL in two places (``settings`` and URLconf).

.. setting:: LOGOUT_REDIRECT_URL

``LOGOUT_REDIRECT_URL``
-----------------------

.. versionadded:: 1.10

Default: ``None``

The URL where requests are redirected after a user logs out using the
:func:`~django.contrib.auth.views.logout` view (if the view doesn't get a
``next_page`` argument).

If ``None``, no redirect will be performed and the logout view will be
rendered.

This setting also accepts view function names and :ref:`named URL patterns
<naming-url-patterns>` which can be used to reduce configuration duplication
since you don't have to define the URL in two places (``settings`` and URLconf).

.. setting:: PASSWORD_RESET_TIMEOUT_DAYS

``PASSWORD_RESET_TIMEOUT_DAYS``
Expand Down
4 changes: 4 additions & 0 deletions docs/releases/1.10.txt
Expand Up @@ -82,6 +82,10 @@ Minor features
* Added the optional ``backend`` argument to :func:`~django.contrib.auth.login`
to allow using it without credentials.

* The new :setting:`LOGOUT_REDIRECT_URL` setting controls the redirect of the
:func:`~django.contrib.auth.views.logout` view, if the view doesn't get a
``next_page`` argument.

:mod:`django.contrib.contenttypes`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Expand Down
4 changes: 3 additions & 1 deletion docs/topics/auth/default.txt
Expand Up @@ -1105,7 +1105,9 @@ implementation details see :ref:`using-the-views`.

**Optional arguments:**

* ``next_page``: The URL to redirect to after logout.
* ``next_page``: The URL to redirect to after logout. Defaults to
:setting:`settings.LOGOUT_REDIRECT_URL <LOGOUT_REDIRECT_URL>` if not
supplied.

* ``template_name``: The full name of a template to display after
logging the user out. Defaults to
Expand Down
12 changes: 12 additions & 0 deletions tests/auth_tests/test_views.py
Expand Up @@ -878,6 +878,18 @@ def test_logout_preserve_language(self):
self.client.get('/logout/')
self.assertEqual(self.client.session[LANGUAGE_SESSION_KEY], 'pl')

@override_settings(LOGOUT_REDIRECT_URL='/custom/')
def test_logout_redirect_url_setting(self):
self.login()
response = self.client.get('/logout/')
self.assertRedirects(response, '/custom/', fetch_redirect_response=False)

@override_settings(LOGOUT_REDIRECT_URL='logout')
def test_logout_redirect_url_named_setting(self):
self.login()
response = self.client.get('/logout/')
self.assertRedirects(response, '/logout/', fetch_redirect_response=False)


# Redirect in test_user_change_password will fail if session auth hash
# isn't updated after password change (#21649)
Expand Down

0 comments on commit dcee1df

Please sign in to comment.