JavaRush /Курсы /Модуль 3: Django /Реализация страницы выхода из системы (logout)

Реализация страницы выхода из системы (logout)

Модуль 3: Django
15 уровень , 6 лекция
Открыта

Мы погрузились в мир аутентификации Django: узнали о встроенной системе аутентификации, расширении модели пользователя и кастомизации User. Затем мы создали страницы для входа и регистрации, разработали формы и обработали данные пользователей, а также настроили валидацию и проверку корректности вводимой информации. Теперь давайте разберем, как организовать выход пользователя из системы. Ведь если он вошел, то должен иметь возможность выйти, верно?

Почему важно правильно настроить выход из системы?

С одной стороны, "выйти из системы" звучит довольно просто: нажал кнопку, и всё. Но если разбираться, в процессе происходит несколько важных вещей:

  1. Завершается текущая сессия пользователя.
  2. Удаляются данные, привязанные к сессии.
  3. Пользователь перенаправляется на заданную страницу.
  4. Безопасность (например, предотвращение CSRF-атак) становится заметной частью процесса.

Корректное завершение сессии — это не только про удобство, но и про безопасность приложения.

Первое знакомство с logout в Django

Django, как всегда, заботливо предоставляет нам всё, что нужно. Вместо самостоятельного написания логики для выхода, мы можем воспользоваться встроенным представлением django.contrib.auth.views.LogoutView.

Почему стоит использовать LogoutView?

  • Оно уже реализовано и протестировано.
  • Встроена защита от CSRF-атак.
  • Очень гибко настраивается.

Настройка URL для выхода

Давайте начнем с самого простого — добавим путь для выхода из системы. Откроем файл urls.py нашего приложения и подключим LogoutView:

from django.contrib.auth.views import LogoutView
from django.urls import path

urlpatterns = [
    # Другие пути...
    path('logout/', LogoutView.as_view(), name='logout'),
]

Теперь наш маршрут /logout/ будет обрабатывать встроенное представление для выхода.

Настройка редиректа после logout

По умолчанию LogoutView перенаправляет пользователя на главную страницу сайта после выхода. Если вы хотите перенаправить пользователей на другую страницу (например, /login/), это можно легко настроить через параметр LOGOUT_REDIRECT_URL в файле settings.py:

# settings.py

LOGOUT_REDIRECT_URL = '/login/'

Теперь, после успешного выхода из системы, пользователь будет перенаправлен на указанную страницу.

Создание шаблона для выхода: добавляем кнопку "Выйти"

Конечно, для работы LogoutView нам нужен интерфейс, чтобы пользователь мог нажать на кнопку "Выйти". Создадим шаблон, где разместим эту кнопку.

Обновляем наш базовый <header>.

Добавим кнопку выхода в шапке вашего сайта. Используем встроенную систему аутентификации Django для отображения кнопки только для авторизованных пользователей, проверяя с помощью request.user.is_authenticated:

<!-- templates/base.html -->
<header>
    <nav>
        <ul>
            <li><a href="/">Главная</a></li>
            {% if user.is_authenticated %}
                <li><a href="{% url 'logout' %}">Выйти</a></li>
            {% else %}
                <li><a href="{% url 'login' %}">Войти</a></li>
                <li><a href="{% url 'register' %}">Регистрация</a></li>
            {% endif %}
        </ul>
    </nav>
</header>

Теперь авторизованные пользователи смогут выйти из системы, нажав "Выйти".

Кастомизация LogoutView

Если встроенное поведение LogoutView вам не подходит, его можно кастомизировать. Например, вы хотите добавить сообщение пользователю после выхода или отправить его на страницу попрощаться (да, некоторая драматичность в web — это нормально).

Для этого создайте свой класс, который наследуется от LogoutView, и переопределите методы:

# views.py
from django.contrib.auth.views import LogoutView
from django.http import HttpResponseRedirect

class CustomLogoutView(LogoutView):
    def get_next_page(self):
        # Вызов стандартного поведения для получения страницы
        next_page = super().get_next_page()

        # Можете добавить свою логику перед редиректом
        print("Пользователь вышел из системы!")

        return next_page or '/goodbye/'

    # Вы можете переопределить другие методы при необходимости

Теперь подключим наш кастомный LogoutView в urls.py:

# urls.py
from .views import CustomLogoutView

urlpatterns = [
    path('logout/', CustomLogoutView.as_view(), name='logout'),
]

Вот так просто можно настроить поведение страницы выхода.

Настройка безопасности процесса выхода

Django автоматически защищает нас от CSRF-атак. Однако если вы добавляете "Выход" через POST-запрос, убедитесь, что ваш шаблон включает CSRF-токен:

<!-- templates/logout.html -->
<form method="post" action="{% url 'logout' %}">
    {% csrf_token %}
    <button type="submit">Выйти</button>
</form>

Это добавляет дополнительный уровень защиты.

При настройке сайта не забывайте использовать HTTPS для защиты пользовательских данных (особенно, если речь идет об аутентификации). Включите в настройках Django параметр SECURE_SSL_REDIRECT:

# settings.py

SECURE_SSL_REDIRECT = True

Даже если у вас локальная разработка, подумайте о том, чтобы тестировать HTTPS через инструменты, такие как ngrok.

Пример завершенной настройки выхода

Итак, мы добавили вход, выход и безопасность. Вот как ваш проект может выглядеть с реализованной системой выхода:

Шаблон base.html

<!-- templates/base.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Мой Django проект</title>
</head>
<body>
<header>
    <nav>
        <ul>
            <li><a href="/">Главная</a></li>
            {% if user.is_authenticated %}
                <li><a href="{% url 'logout' %}">Выйти</a></li>
            {% else %}
                <li><a href="{% url 'login' %}">Войти</a></li>
                <li><a href="{% url 'register' %}">Регистрация</a></li>
            {% endif %}
        </ul>
    </nav>
</header>
<main>
    {% block content %}
    {% endblock %}
</main>
</body>
</html>

urls.py

from django.urls import path
from django.contrib.auth.views import LogoutView

urlpatterns = [
    path('logout/', LogoutView.as_view(), name='logout'),
]

settings.py

LOGOUT_REDIRECT_URL = '/login/'
SECURE_SSL_REDIRECT = True  # для использования HTTPS

Теперь пользователь может безопасно выйти из системы, а мы, как разработчики, можем спать спокойно, зная, что все работает корректно.

Теперь вы знаете, как настроить процесс выхода из системы в Django, обеспечив удобство и безопасность для пользователей.

1
Задача
Модуль 3: Django, 15 уровень, 6 лекция
Недоступна
Настройка перенаправления после logout
Настройка перенаправления после logout
1
Задача
Модуль 3: Django, 15 уровень, 6 лекция
Недоступна
Кастомное представление для logout
Кастомное представление для logout
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ