Система пользователей — Регистрация, Вход, Выход

В этой главе вы научитесь использовать встроенную систему аутентификации Django для реализации регистрации, входа и выхода пользователей.


Встроенная система аутентификации Django

Django поставляется с полным модулем аутентификации пользователей:

  • ВстроенныйUserМодели (имя пользователя, пароль, электронная почта и т.д.)
  • Встроенные представления для входа/выхода (не нужно писать логику самостоятельно)
  • Встроенные разрешения и управление группами
  • Валидация форм и защита безопасности (CSRF, XSS)

Этот модульdjango.contrib.authОн зарегистрирован в INSTALLED_APPS по умолчанию при создании проекта.


Страница регистрации

В Django есть встроенные представления для входа/выхода, но нет встроенного представления для регистрации, поэтому нам нужно написать его самим.

Шаг 1: Создание формы регистрации

Пример

# Путь к файлу: blog/forms.py (новый файл)
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: Напишите представление регистрации

Пример

# Путь к файлу: blog/views.py (недавно добавлено)
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'
    })

DjangomessagesЭтот фреймворк используется для передачи одноразовых сообщений между запросами (например, "Регистрация прошла успешно"). Отображая область сообщений в шаблоне, пользователи могут видеть обратную связь об операции. Он работает с сессией, и сообщение автоматически исчезает после первого отображения.


Вход и выход

В Django есть встроенные представления входа и выхода; вам просто нужно включить их в конфигурацию URL.

Пример

# Путь к файлу: blog/urls.py
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:

Пример

# Путь к файлу: добавьте в конец blog_project/settings.py
LOGIN_URL = 'login'                    # Неаутентифицированные пользователи, обращающиеся к защищённым страницам, перенаправляются на страницу входа.
LOGIN_REDIRECT_URL = 'index'           # Перенаправление на главную страницу после успешного входа
LOGOUT_REDIRECT_URL = 'index'          # Перенаправление на главную страницу после выхода

Создайте шаблоны для аутентификации

Шаблон входа

Пример

<!-- Путь к файлу: blog/templates/blog/login.html -->
{% 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 %}

Шаблон регистрации

Пример

<!-- Путь к файлу: blog/templates/blog/register.html -->
{% 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, чтобы отображать различное содержимое в зависимости от статуса входа.

Пример

<!-- Измените раздел панели навигации в blog/templates/blog/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Определите, вошёл ли пользователь в систему.


Стилизация страницы входа

Пример

/* Добавьте к стилю в base.html */
.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 в шаблонах для проверки статуса входа.

Теперь в блоге есть полный цикл регистрации, входа и выхода пользователя.

Другие расширения