Авторизация в Django: регистрация, вход и выход за час
Пошаговая настройка входа, выхода и регистрации пользователей на встроенном django.contrib.auth в Django 5.x. К концу у вас работает форма логина и защищённые страницы.

К концу этой инструкции у вас будет рабочая авторизация: пользователь регистрируется, входит по логину и паролю, выходит, а закрытые страницы недоступны без входа. Всё на встроенном модуле django.contrib.auth — без сторонних пакетов. По времени — около часа, если проект уже создан.
Django из коробки умеет почти всё, что нужно для входа: модель пользователя, хеширование паролей, сессии, формы и готовые view-классы. Писать свою проверку пароля не нужно и опасно — используем то, что дают.
Что нужно до начала
Проверьте окружение перед первым шагом, чтобы не упереться на середине:
- Python 3.10+ и Django 5.x (проверьте:
python -m django --version). - Созданный проект и хотя бы одно приложение. Дальше приложение называется
accounts. - Приложения
django.contrib.authиdjango.contrib.sessionsвINSTALLED_APPS— в новом проекте они уже там. - Выполненные миграции:
python manage.py migrate. Таблицыauth_userи сессий должны существовать.
Если проекта ещё нет — создайте его командами django-admin startproject и python manage.py startapp accounts, добавьте accounts в INSTALLED_APPS, и возвращайтесь сюда.
Шаг 1. Настроить маршруты для входа и выхода
Django даёт готовый набор view для входа, выхода и смены пароля в django.contrib.auth.urls. Подключите его в корневом urls.py:
# myproject/urls.py — Django 5.x
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
# даёт /accounts/login/, /accounts/logout/, /accounts/password_change/ и т.д.
path('accounts/', include('django.contrib.auth.urls')),
]Проверка: откройте http://127.0.0.1:8000/accounts/login/. Вы увидите ошибку про отсутствующий шаблон registration/login.html — это нормально, view работает, шаблона пока нет. Его сделаем на следующем шаге.
Шаг 2. Создать шаблон формы входа
View LoginView по умолчанию ищет шаблон registration/login.html. Создайте папку templates/registration/ внутри приложения и файл в ней:
<!-- accounts/templates/registration/login.html -->
<h1>Вход</h1>
{% if form.errors %}
<p>Неверный логин или пароль.</p>
{% endif %}
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Войти</button>
<input type="hidden" name="next" value="{{ next }}">
</form>Чтобы Django нашёл шаблон, в настройках TEMPLATES параметр APP_DIRS должен быть True (в новом проекте так и есть).
Проверка: обновите /accounts/login/. Появится форма с полями логина и пароля. Токен csrf_token обязателен — без него POST вернёт 403.
Шаг 3. Настроить редиректы после входа и выхода
По умолчанию после успешного входа Django ведёт на /accounts/profile/, которого у вас нет. Задайте свои адреса в settings.py:
# myproject/settings.py
LOGIN_REDIRECT_URL = '/' # куда вести после входа
LOGOUT_REDIRECT_URL = '/' # куда вести после выхода
LOGIN_URL = '/accounts/login/' # куда отправлять неавторизованногоНачиная с Django 5.x LogoutView принимает только POST. Обычная ссылка <a href> на logout больше не работает — нужна форма с кнопкой:
<!-- кнопка выхода в любом шаблоне -->
<form method="post" action="{% url 'logout' %}">
{% csrf_token %}
<button type="submit">Выйти</button>
</form>Проверка: создайте суперпользователя (python manage.py createsuperuser), войдите через форму — вас перекинет на /. Нажмите «Выйти» — сессия сбросится.
Шаг 4. Закрыть страницы от неавторизованных
Для функциональных view используйте декоратор login_required. Он проверяет сессию и при её отсутствии редиректит на LOGIN_URL, добавляя параметр ?next= с исходным адресом.
# accounts/views.py
from django.contrib.auth.decorators import login_required
from django.shortcuts import render
@login_required
def dashboard(request):
# request.user здесь гарантированно авторизован
return render(request, 'dashboard.html', {'user': request.user})Для class-based view применяйте миксин LoginRequiredMixin — ставьте его первым в списке наследования:
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import TemplateView
class DashboardView(LoginRequiredMixin, TemplateView):
template_name = 'dashboard.html'Проверка: откройте закрытую страницу без входа — вас перебросит на форму логина, а после входа вернёт обратно благодаря next.
Шаг 5. Добавить регистрацию
Готового URL для регистрации в auth.urls нет — его пишут сами, но на встроенной форме UserCreationForm. Она проверяет совпадение паролей и их сложность.
# accounts/views.py
from django.contrib.auth import login
from django.contrib.auth.forms import UserCreationForm
from django.shortcuts import render, redirect
def signup(request):
if request.method == 'POST':
form = UserCreationForm(request.POST)
if form.is_valid():
user = form.save()
login(request, user) # сразу входим после регистрации
return redirect('/')
else:
form = UserCreationForm()
return render(request, 'registration/signup.html', {'form': form})Подключите view в urls.py приложения и создайте шаблон registration/signup.html по образцу login.html — с {% csrf_token %} и {{ form.as_p }}.
Не храните пароли сами и не пишите свою проверку.UserCreationForm.save()иset_password()хешируют пароль алгоритмом из настройкиPASSWORD_HASHERS. В базе пароль в открытом виде не появится никогда.
Шаг 6. Показать имя пользователя в шаблоне
Объект request.user доступен в шаблонах через контекст-процессор auth (включён по умолчанию). Ветвитесь по is_authenticated:
{% if user.is_authenticated %}
<p>Вы вошли как {{ user.username }}</p>
{% else %}
<a href="{% url 'login' %}">Войти</a>
{% endif %}Если не получилось
- TemplateDoesNotExist: registration/login.html — шаблон лежит не в
templates/registration/либо приложение не вINSTALLED_APPS. Проверьте путь иAPP_DIRS: True. - 403 Forbidden, CSRF verification failed — в форме нет
{% csrf_token %}. Добавьте его внутрь каждого<form method="post">. - 405 Method Not Allowed при выходе — вы ведёте на logout ссылкой. В Django 5.x logout только POST, сделайте форму с кнопкой.
- После входа перекидывает на /accounts/profile/ с ошибкой 404 — не задан
LOGIN_REDIRECT_URL. Пропишите нужный адрес в settings. - Зацикливание редиректов на login —
LOGIN_URLуказывает на страницу, которая сама подlogin_required. Уберите защиту с самой формы входа.
Что делать дальше
База готова. Следующие шаги в порядке приоритета: настроить сброс пароля через email (view PasswordResetView уже подключён через auth.urls, нужен только рабочий EMAIL_BACKEND и шаблоны), а затем решить, нужна ли вам кастомная модель пользователя. Если планируете вход по email вместо username — переопределять модель лучше в самом начале проекта через AUTH_USER_MODEL, потому что менять её на данных уже нельзя без миграционной боли. Ограничение попыток входа и двухфакторную аутентификацию встроенный auth не делает — это отдельная тема со сторонними пакетами.
Карточки для маркетплейсов: Таблица товаров и папка фотографий на входе — комплект слайдов и описаний на выходе, по требованиям Wildberries и Ozon.
Спросить за 5 ₽Источники: Django docs — Using the Django authentication system, Django docs — Authentication views
Частые вопросы
У меня Django 4.2, а не 5.x — инструкция подойдёт?
Можно ли входить по email вместо логина?
Форма выдаёт 403 CSRF при отправке, хотя я всё сделал по шагам.
Пароли хранятся безопасно или нужно что-то донастроить?
Как проверить силу пароля при регистрации?
Нужен ли сторонний пакет вроде django-allauth?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.