Menu
CoddyTech

Выход из системы

Часть раздела Пользователи и учетные записи путешествия по Django на Coddy. Урок 3 из 16.

У вошедшего пользователя нет возможности выйти из учётной записи. Тот же include() добавил /accounts/logout/ с именем logout: он завершает сеанс, поэтому cookie больше не указывает на пользователя.

Обычная ссылка не подойдёт. Ссылка отправляет GET-запрос, а GET-запрос никогда не должен ничего менять: страница может скрыть изображение, адрес которого совпадает с URL для выхода из учётной записи, и тем самым выполнить выход. Поэтому LogoutView принимает только POST, а в ответ на GET возвращается 405 Method not allowed.

Кнопка, которая что-то меняет, — это небольшая POST-форма, даже если в ней нет полей. Её action указывает URL, на который она отправляет данные, поэтому её можно разместить на любой странице:

<form method="post" action="{% url 'cart:empty' %}">
    {% csrf_token %}
    <button type="submit">Empty cart</button>
</form>

После выхода из учётной записи Django перенаправляет на LOGOUT_REDIRECT_URL. По умолчанию это значение не задано: без него вы увидите страницу администратора Logged out. Задайте для него значение "/" в settings.py.

challenge icon

Задание

Легко

Добавьте кнопку Log out.

  1. В base.html, под текстом Signed in as, добавьте форму, которая отправляет данные методом POST на {% url 'logout' %}, с тегом {% csrf_token %} и кнопкой Log out.
  2. В settings.py установите для LOGOUT_REDIRECT_URL значение "/".

Войдите как ada (пароль coddy-pass-123) и нажмите «Выйти»: в заголовке появится сообщение You are not signed in.

Попробуйте сами

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>{% block title %}Notes{% endblock %}</title>
    <link rel="stylesheet" href="{% static 'notes/style.css' %}">
</head>
<body>
    <header>
        <a class="brand" href="{% url 'notes:list' %}">Notes</a>
        <nav>
            <a href="{% url 'notes:create' %}">New note</a>
        </nav>
        <div class="account">
            {% if user.is_authenticated %}
            <p>Signed in as {{ user.username }}</p>
            {% else %}
            <p>You are not signed in.</p>
            <a href="{% url 'login' %}">Log in</a>
            {% endif %}
        </div>
    </header>
    <main>
        {% block content %}{% endblock %}
    </main>
</body>
</html>
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Пользователи и учетные записи

Потренируйтесь самостоятельно: Песочница Django