Использование системы аутентификации Django
Готовые представления
Писать вход и выход вручную не нужно — в 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 сам:
- принимает email на странице
password_reset; - отправляет письмо со ссылкой с одноразовым токеном;
- по ссылке открывает форму нового пароля (
password_reset_confirm); - показывает страницу «Готово».
Достаточно создать шаблоны (или пользоваться шаблонами админки по умолчанию).
Итог
include("django.contrib.auth.urls")даёт вход, выход, смену и сброс пароля.- Шаблоны кладём в
registration/, приложениеaccount— вышеadminвINSTALLED_APPS. - Выход — POST-форма с
csrf_token. @login_requiredиLoginRequiredMixinзащищают страницы,LOGIN_URLиLOGIN_REDIRECT_URLуправляют переходами.
Практика решено 0 из 6
Подключите все встроенные маршруты аутентификации (вход, выход, смена и сброс пароля)
по префиксу accounts/ в главном urls.py.
urlpatterns = [
path("admin/", admin.site.urls),
path("accounts/", include("django.contrib.auth.urls")),
]
Где Django ищет шаблон страницы входа для LoginView по умолчанию?
Защитите view dashboard так, чтобы её могли открыть только вошедшие пользователи,
используя декоратор из django.contrib.auth.decorators.
from django.contrib.auth.decorators import login_required
@login_required
def dashboard(request):
return render(request, "account/dashboard.html")
Какие настройки связаны с перенаправлениями при входе и выходе?
Почему в Django 5 кнопка выхода должна быть формой с методом POST, а не ссылкой?
Анонимный пользователь открыл /dashboard/, защищённую login_required. Куда его перенаправят, если LOGIN_URL = "login" и вход по адресу /accounts/login/? Напишите полный путь с параметром.
Войдите, чтобы отмечать пройденные уроки.