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, забезпечивши зручність і безпеку для користувачів.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ