Использование системы аутентификации Django

⏱ 25 мин · 🧩 заданий: 6

Готовые представления

Писать вход и выход вручную не нужно — в django.contrib.auth.views есть готовые классы:

View Что делает Шаблон по умолчанию
LoginView Вход registration/login.html
LogoutView Выход (POST) registration/logged_out.html
PasswordChangeView Смена пароля registration/password_change_form.html
PasswordChangeDoneView Пароль сменён registration/password_change_done.html
PasswordResetView Запрос сброса по email registration/password_reset_form.html
PasswordResetDoneView Письмо отправлено registration/password_reset_done.html
PasswordResetConfirmView Новый пароль по ссылке registration/password_reset_confirm.html
PasswordResetCompleteView Готово registration/password_reset_complete.html

Приложение account

Создадим отдельное приложение для всего, что связано с пользователями:

python manage.py startapp account

Добавьте "account.apps.AccountConfig" в INSTALLED_APPS выше django.contrib.admin — так ваши шаблоны registration/*.html будут найдены раньше шаблонов админки с теми же именами.

Маршруты

Все маршруты разом:

# account/urls.py
from django.urls import include, path

from . import views

urlpatterns = [
    path("", include("django.contrib.auth.urls")),
    path("", views.dashboard, name="dashboard"),
]
# mysite/urls.py
path("account/", include("account.urls")),

django.contrib.auth.urls добавляет маршруты с именами login, logout, password_change, password_change_done, password_reset, password_reset_done, password_reset_confirm, password_reset_complete.

Если нужно настроить конкретную view — подключайте по одной:

from django.contrib.auth import views as auth_views

path("login/", auth_views.LoginView.as_view(template_name="account/login.html"), name="login"),

Шаблон входа

account/templates/registration/login.html:

{% extends "base.html" %}

{% block title %}Вход{% endblock %}

{% block content %}
  <h1>Вход</h1>
  {% if form.errors %}
    <p class="error">Неверное имя пользователя или пароль.</p>
  {% endif %}
  <form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="hidden" name="next" value="{{ next }}">
    <input type="submit" value="Войти">
  </form>
  <p><a href="{% url 'password_reset' %}">Забыли пароль?</a></p>
{% endblock %}

Скрытое поле next хранит адрес, куда вернуть пользователя после входа.

Выход — только POST

С Django 5 LogoutView принимает только POST-запросы (выход меняет состояние и должен быть защищён от CSRF):

{% if user.is_authenticated %}
  <form method="post" action="{% url 'logout' %}">
    {% csrf_token %}
    <button type="submit">Выйти</button>
  </form>
{% else %}
  <a href="{% url 'login' %}">Войти</a>
{% endif %}

Настройки перенаправлений

LOGIN_REDIRECT_URL = "dashboard"   # куда после входа (если нет next)
LOGIN_URL = "login"                # куда отправлять неавторизованных
LOGOUT_REDIRECT_URL = "login"      # куда после выхода

Значения — имена маршрутов или пути.

Защита страниц

Функции:

from django.contrib.auth.decorators import login_required, permission_required


@login_required
def dashboard(request):
    return render(request, "account/dashboard.html", {"section": "dashboard"})


@permission_required("blog.add_post", raise_exception=True)
def post_create(request):
    ...

Классы:

from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin


class DashboardView(LoginRequiredMixin, TemplateView):
    template_name = "account/dashboard.html"

Анонимный пользователь будет перенаправлен на LOGIN_URL с параметром ?next=/dashboard/, а после входа вернётся обратно.

Сброс пароля по email

Для password_reset нужна настроенная почта (в разработке — console.EmailBackend). Django сам:

  1. принимает email на странице password_reset;
  2. отправляет письмо со ссылкой с одноразовым токеном;
  3. по ссылке открывает форму нового пароля (password_reset_confirm);
  4. показывает страницу «Готово».

Достаточно создать шаблоны (или пользоваться шаблонами админки по умолчанию).

Итог

  • include("django.contrib.auth.urls") даёт вход, выход, смену и сброс пароля.
  • Шаблоны кладём в registration/, приложение account — выше admin в INSTALLED_APPS.
  • Выход — POST-форма с csrf_token.
  • @login_required и LoginRequiredMixin защищают страницы, LOGIN_URL и LOGIN_REDIRECT_URL управляют переходами.

Практика решено 0 из 6

Вы не вошли — ответы проверяются, но прогресс не сохранится. Войти или зарегистрироваться.
Задание 1 Написать код

Подключите все встроенные маршруты аутентификации (вход, выход, смена и сброс пароля) по префиксу accounts/ в главном urls.py.

Задание 2 Один вариант ответа

Где Django ищет шаблон страницы входа для LoginView по умолчанию?

Задание 3 Написать код

Защитите view dashboard так, чтобы её могли открыть только вошедшие пользователи, используя декоратор из django.contrib.auth.decorators.

Задание 4 Несколько вариантов

Какие настройки связаны с перенаправлениями при входе и выходе?

Задание 5 Один вариант ответа

Почему в Django 5 кнопка выхода должна быть формой с методом POST, а не ссылкой?

Задание 6 Ввод ответа

Анонимный пользователь открыл /dashboard/, защищённую login_required. Куда его перенаправят, если LOGIN_URL = "login" и вход по адресу /accounts/login/? Напишите полный путь с параметром.

Войдите, чтобы отмечать пройденные уроки.