Система пользователей — Регистрация, Вход, Выход
В этой главе вы научитесь использовать встроенную систему аутентификации Django для реализации регистрации, входа и выхода пользователей.
Встроенная система аутентификации Django
Django поставляется с полным модулем аутентификации пользователей:
- Встроенный
UserМодели (имя пользователя, пароль, электронная почта и т.д.) - Встроенные представления для входа/выхода (не нужно писать логику самостоятельно)
- Встроенные разрешения и управление группами
- Валидация форм и защита безопасности (CSRF, XSS)
Этот модульdjango.contrib.authОн зарегистрирован в INSTALLED_APPS по умолчанию при создании проекта.
Страница регистрации
В Django есть встроенные представления для входа/выхода, но нет встроенного представления для регистрации, поэтому нам нужно написать его самим.
Шаг 1: Создание формы регистрации
Пример
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import Пользователь
class RegisterForm(UserCreationForm):
Пользовательская форма регистрации: наследуйте UserCreationForm, добавьте поле email
email = forms.EmailField(
label=Электронная почта,
required=True,
help_text=Пожалуйста, введите действительный адрес электронной почты.
)
class Meta:
model = User
fields = ['username', 'email', 'password1', 'password2']
labels = {
'username': Имя пользователя,
}
Шаг 2: Напишите представление регистрации
Пример
from django.shortcuts import render, redirect
from django.contrib.auth import login
from django.contrib import messages
from .forms import RegisterForm
def register(request):
"""Представление регистрации пользователя"""
# Если пользователь уже авторизован, перенаправить сразу на главную страницу.
if request.user.is_authenticated:
return redirect('index')
if request.method == 'POST':
# Пользователь отправил форму регистрации
form = RegisterForm(request.POST)
if form.is_valid():
user = form.save() # Сохранить пользователя в базу данных
login(request, user) # Автоматически войти после регистрации
messages.success(request, fРегистрация прошла успешно, добро пожаловать, {user.username}!)
return redirect('index')
else:
# GET-запрос: отображает пустую форму регистрации
form = RegisterForm()
return render(request, 'blog/register.html', {
'form': form,
'title': 'Регистрация - EXAMPLE Blog'
})
Django
messagesЭтот фреймворк используется для передачи одноразовых сообщений между запросами (например, "Регистрация прошла успешно"). Отображая область сообщений в шаблоне, пользователи могут видеть обратную связь об операции. Он работает с сессией, и сообщение автоматически исчезает после первого отображения.
Вход и выход
В Django есть встроенные представления входа и выхода; вам просто нужно включить их в конфигурацию URL.
Пример
from django.urls import path
from django.contrib.auth import views as auth_views
from . import views
urlpatterns = [
path('', views.index, name='index'),
path('post/<int:pk>/', views.post_detail, name='post_detail'),
path('register/', views.register, name='register'),
# Встроенное представление входа Django
# template_name: указывает, какой шаблон использовать
path('login/', auth_views.LoginView.as_view(
template_name='blog/login.html',
redirect_authenticated_user=True # Пользователи, вошедшие в систему, при посещении страницы входа перенаправляются напрямую.
), name='login'),
# Встроенное представление выхода Django
path('logout/', auth_views.LogoutView.as_view(), name='logout'),
]
Настройте адреса перенаправления для входа и выхода в settings.py:
Пример
LOGIN_URL = 'login' # Неаутентифицированные пользователи, обращающиеся к защищённым страницам, перенаправляются на страницу входа.
LOGIN_REDIRECT_URL = 'index' # Перенаправление на главную страницу после успешного входа
LOGOUT_REDIRECT_URL = 'index' # Перенаправление на главную страницу после выхода
Создайте шаблоны для аутентификации
Шаблон входа
Пример
{% extends 'blog/base.html' %}
{% block title %}Вход - EXAMPLE Blog{% endblock %}
{% block content %}
<div class="auth-form">
<h2>Войти</h2>
<form method="post">
{% csrf_token %}
<div class="form-group">
<label>Имя пользователя</label>
{{ form.username }}
</div>
<div class="form-group">
<label>Пароль</label>
{{ form.password }}
</div>
{% if form.errors %}
<p class="error-msg">Неверное имя пользователя или пароль, попробуйте еще раз.</p>
{% endif %}
<button type="submit" class="btn-submit">Войти</button>
</форма>
<p class="form-footer">
Ещё нет аккаунта?<a href="{% url 'register' %}">Зарегистрируйтесь сейчас</a>
</p>
</div>
{% endblock %}
Шаблон регистрации
Пример
{% extends 'blog/base.html' %}
{% block title %}Регистрация - EXAMPLE Blog{% endblock %}
{% block content %}
<div class="auth-form">
<h2>Регистр</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="btn-submit">Зарегистрироваться</button>
</форма>
<p class="form-footer">
Уже есть аккаунт?<a href="{% url 'login' %}">Войдите сейчас</a>
</p>
</div>
{% endblock %}
{% csrf_token %}Это механизм безопасности Django для предотвращения атак межсайтовой подделки запроса. Любая POST-форма должна включать его, иначе Django отклонит запрос (ошибка 403). Этот тег создаёт скрытое поле ввода, содержащее случайный CSRF-токен.
Отображение статуса входа в панели навигации
Обновите панель навигации в base.html, чтобы отображать различное содержимое в зависимости от статуса входа.
Пример
<header class="navbar">
<a href="/" class="logo">ПРИМЕР Блог</a>
<nav>
<a href="/">Главная</a>
{% if user.is_authenticated %}
{# Выполнен вход: отобразить имя пользователя и кнопку выхода (пользователь автоматически внедряется Django) #}
<span class="user-name">{{ user.username }}</span>
<a href="{% url 'logout' %}">Выход</a>
{% else %}
{# Не выполнен вход: показать ссылки для входа и регистрации #}
<a href="{% url 'login' %}">Войти</a>
<a href="{% url 'register' %}">Регистрация</a>
{% endif %}
</nav>
</header>
Контекстный процессор шаблонов Django будет автоматически
{{ user }}внедрять его в каждый шаблон без необходимости передавать его вручную в views.py. Вы можете использоватьuser.is_authenticatedОпределите, вошёл ли пользователь в систему.
Стилизация страницы входа
Пример
.auth-form {
max-width: 400px;
margin: 40px auto;
padding: 30px;
background: #fff;
border-radius: 12px;
box-shadow: 0 2px 12px rgba(0,0,0,0.08);
}
.auth-form h2 {
margin-bottom: 24px;
text-align: center;
}
.auth-form .form-group {
margin-bottom: 16px;
}
.auth-form label {
display: block;
margin-bottom: 6px;
font-weight: 500;
}
.auth-form input {
width: 100%;
padding: 10px 12px;
border: 1px solid #ddd;
border-radius: 6px;
font-size: 14px;
}
.btn-submit {
width: 100%;
padding: 12px;
background: #2c3e50;
color: #fff;
border: none;
border-radius: 6px;
font-size: 16px;
cursor: pointer;
margin-top: 10px;
}
.error-msg {
color: #e74c3c;
font-size: 14px;
}
.form-footer {
margin-top: 16px;
text-align: center;
font-size: 14px;
}
.user-name {
color: #2c3e50;
font-weight: 500;
}
Итоги главы
В этой главе вы интегрировали встроенную систему аутентификации Django: унаследовали UserCreationForm для создания формы регистрации, использовали LoginView/LogoutView для реализации входа/выхода, использовали csrf_token для защиты POST-запросов и использовали user.is_authenticated в шаблонах для проверки статуса входа.
Теперь в блоге есть полный цикл регистрации, входа и выхода пользователя.
Другие расширения