В предыдущем уроке мы подключили приложение users, настроили маршруты и убедились, что Django готов работать с системой пользователей.
Теперь пришло время реализовать реальный вход пользователя в систему.
В этом уроке мы шаг за шагом создадим собственную страницу авторизации, разберёмся, как Django проверяет логин и пароль, и научимся «входить» пользователя в систему с помощью встроенных инструментов.
Прежде чем писать код, важно понять общую схему.
Когда пользователь пытается войти в систему, Django выполняет следующую последовательность действий:
- Получает логин и пароль из формы.
- Проверяет, существует ли такой пользователь.
- Сравнивает введённый пароль с хешем в базе данных.
- Если всё корректно — создаёт сессию пользователя.
- Связывает текущий HTTP-запрос с этим пользователем.
За ключевые шаги отвечают две функции:
authenticate()— проверяет учетные данные;login()— выполняет вход и создаёт сессию.
Начнём с формы, через которую пользователь будет вводить данные.
Если файла forms.py ещё нет — создайте его в приложении users.
from django import forms
class LoginUserForm(forms.Form):
username = forms.CharField(
label="Логин",
widget=forms.TextInput(attrs={"class": "form-input"})
)
password = forms.CharField(
label="Пароль",
widget=forms.PasswordInput(attrs={"class": "form-input"})
)- Мы используем обычную форму, не связанную с моделью.
- Поле
passwordиспользуетPasswordInput, поэтому введённый текст скрыт. - Пока мы работаем с
username, а не с email — это стандартное поведение Django.
Теперь создадим HTML-шаблон для отображения формы.
Внутри приложения users создайте папки:
users/
└── templates/
└── users/
└── login.html
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Вход в Cinemahub</title>
</head>
<body>
<h1>Авторизация в Cinemahub</h1>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Войти</button>
</form>
</body>
</html>На данном этапе мы не привязываемся к общему шаблону проекта, чтобы урок оставался универсальным и понятным.
Теперь обновим представление входа, чтобы оно отображало форму.
from django.shortcuts import render
from .forms import LoginUserForm
def login_user(request):
form = LoginUserForm()
return render(request, "users/login.html", {"form": form})Запустите сервер:
python manage.py runserverПерейдите по адресу:
http://127.0.0.1:8000/users/login/
Если вы видите форму с полями логина и пароля — значит:
- шаблон найден корректно;
- форма передаётся в контекст;
- маршрутизация работает правильно.
Теперь добавим логику проверки логина и пароля.
Функция authenticate():
- принимает учетные данные;
- ищет пользователя в базе;
- проверяет пароль;
- возвращает объект пользователя или
None.
Пример:
from django.contrib.auth import authenticate
user = authenticate(username="admin", password="12345")Если данные неверны — user будет равен None.
Если пользователь найден, его нужно «впустить» в систему.
Функция login(request, user):
- привязывает пользователя к текущему запросу;
- сохраняет его ID в сессии;
- делает пользователя доступным как
request.user.
Без вызова login() пользователь не считается авторизованным, даже если пароль верный.
Теперь объединим всё в одном представлении.
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login, logout
from django.urls import reverse
from .forms import LoginUserForm
def login_user(request):
if request.method == "POST":
form = LoginUserForm(request.POST)
if form.is_valid():
cd = form.cleaned_data
user = authenticate(
request,
username=cd["username"],
password=cd["password"]
)
if user is not None and user.is_active:
login(request, user)
return redirect("movies:movie_list")
else:
form.add_error(None, "Неверный логин или пароль")
else:
form = LoginUserForm()
return render(request, "users/login.html", {"form": form})-
Проверяем тип запроса (
GETилиPOST). -
Валидируем форму.
-
Получаем очищенные данные (
cleaned_data). -
Проверяем пользователя через
authenticate(). -
Если пользователь существует и активен:
- выполняем вход через
login(); - перенаправляем на список фильмов.
- выполняем вход через
-
Если данные неверны — добавляем ошибку формы.
Для выхода пользователя Django предоставляет функцию logout().
def logout_user(request):
logout(request)
return redirect("users:login")После выхода:
- сессия очищается;
- пользователь становится анонимным;
request.user.is_authenticatedвозвращаетFalse.
Через админ-панель или команду:
python manage.py createsuperuser/users/login/
Введите корректные данные.
- пользователь перенаправляется на страницу со списком фильмов;
- Django «помнит» пользователя между запросами.
В Django имя вошедшего пользователя доступно в шаблоне через объект request.user.
В вашем базовом шаблоне можно добавить такой код:
<header>
<p>Привет, {{ request.user.username }}!</p>
</header>Причины:
- неверный пароль;
- пользователь не активен (
is_active=False); - забыли вызвать
login().
Причина — отсутствие {% csrf_token %} в форме.
Возможные причины:
- неверный
username; - пароль передан не строкой;
- пользователь не существует.
Добавьте вывод сообщения
Вы успешно вошли в систему
после успешной авторизации. (В шаблоне эту информацию содержит request.session.login_success)
Измените перенаправление после входа на страницу конкретного фильма.
Добавьте проверку, чтобы авторизованный пользователь не мог снова открыть страницу входа.
В представлении:
request.session["login_success"] = TrueВ шаблоне:
{% if request.session.login_success %}
<p>Вы успешно вошли в систему</p>
{% endif %}return redirect("movies:movie_detail", slug="test-movie")if request.user.is_authenticated:
return redirect("movies:movie_list")- В чём разница между
authenticate()иlogin()? - Что возвращает
authenticate(), если данные неверны? - Почему без
login()пользователь не считается авторизованным? - Где хранится информация об авторизованном пользователе?
- Что делает
logout()? - Почему важен
{% csrf_token %}? - Как проверить, авторизован ли пользователь?
- Можно ли войти в систему с неактивным пользователем?
- Где обычно происходит перенаправление после входа?