JavaRush /Курсы /Модуль 3: Django /Практическое занятие по созданию аутентификации

Практическое занятие по созданию аутентификации

Модуль 3: Django
15 уровень , 9 лекция
Открыта

На этой лекции у нас не будет длинных теоретических вступлений — только код, практика и небольшая творческая агония (без неё программирование невозможно!). Мы будем строить систему аутентификации для нашего Django-приложения. Вы уже знаете, что это такое, как это работает и какие кирпичики есть в Django для её реализации. Сегодня всё соберём воедино.

Структура задачи

Сегодня мы сделаем:

  1. Создание формы регистрации пользователя.
  2. Создание системы входа и выхода из аккаунта.
  3. Добавим ограничение доступа к некоторым страницам.
  4. Настроим редиректы для большей логики работы.
  5. Создадим шаблоны для всех этапов аутентификации.

Давайте начнём!

Шаг 1: создаём форму регистрации

Для управления пользователями изначально используем стандартную модель User. Создадим форму регистрации, которая будет собирать имя пользователя, email и пароль.

Начнём с создания формы в файле forms.py в нашем приложении:

from django import forms
from django.contrib.auth.models import User
from django.core.exceptions import ValidationError

class UserRegistrationForm(forms.ModelForm):
    password = forms.CharField(
        label='Пароль',
        widget=forms.PasswordInput,
        min_length=8
    )
    password_confirm = forms.CharField(
        label='Подтверждение пароля',
        widget=forms.PasswordInput
    )

    class Meta:
        model = User
        fields = ['username', 'email', 'password']

    # Проверяем совпадение паролей
    def clean_password_confirm(self):
        password = self.cleaned_data['password']
        password_confirm = self.cleaned_data['password_confirm']
        if password != password_confirm:
            raise ValidationError('Пароли не совпадают.')
        return password_confirm
  • Мы использовали Meta для привязки формы к модели User.
  • Добавили поле для подтверждения пароля.
  • Реализовали валидацию паролей через метод clean_password_confirm.

Шаг 2: Регистрация пользователя

Теперь создадим представление для регистрации и соответствующий URL.

В файле views.py:

from django.shortcuts import render, redirect
from .forms import UserRegistrationForm
from django.contrib.auth import login

def register(request):
    if request.method == 'POST':
        form = UserRegistrationForm(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            user.set_password(form.cleaned_data['password'])  # Устанавливаем пароль
            user.save()
            login(request, user)  # Автоматически логиним после регистрации
            return redirect('home')  # Редирект на главную страницу
    else:
        form = UserRegistrationForm()
    return render(request, 'register.html', {'form': form})

URL для регистрации (файл urls.py):

from django.urls import path
from . import views

urlpatterns = [
    path('register/', views.register, name='register'),
]

Создайте новый шаблон register.html:

<!DOCTYPE html>
<html>
<head>
    <title>Регистрация</title>
</head>
<body>
    <h1>Регистрация</h1>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Зарегистрироваться</button>
    </form>
</body>
</html>

Отлично! Теперь пользователи могут регистрироваться.

Шаг 3: Вход и выход

Используем встроенные представления Django для входа и выхода.

В файле views.py всё просто:

from django.contrib.auth.views import LoginView, LogoutView

class UserLoginView(LoginView):
    template_name = 'login.html'

class UserLogoutView(LogoutView):
    next_page = 'home'  # Редирект после выхода

Для входа и выхода в файле urls.py:

urlpatterns += [
    path('login/', UserLoginView.as_view(), name='login'),
    path('logout/', UserLogoutView.as_view(), name='logout'),
]

Создайте новый шаблон login.html:

<!DOCTYPE html>
<html>
<head>
    <title>Вход</title>
</head>
<body>
    <h1>Вход</h1>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Войти</button>
    </form>
</body>
</html>

Теперь пользователи могут входить и выходить из системы.

Шаг 4: Ограничение доступа

Давайте сделаем страницу, доступную только для авторизованных пользователей.

Представление для защищённой страницы, добавляем:

from django.contrib.auth.decorators import login_required

@login_required
def restricted_page(request):
    return render(request, 'restricted_page.html')

В файле urls.py:

urlpatterns += [
    path('restricted/', views.restricted_page, name='restricted'),
]

Создадим шаблон restricted_page.html

<!DOCTYPE html>
<html>
<head>
    <title>Доступная только для авторизованных</title>
</head>
<body>
    <h1>Привет, авторизованный пользователь!</h1>
    <p>Эта страница доступна только после авторизации.</p>
</body>
</html>

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

Шаг 5: Персонализация редиректов

В файле settings.py добавьте:

LOGIN_REDIRECT_URL = 'home'  # Куда редиректить после успешного входа
LOGOUT_REDIRECT_URL = 'login'  # Куда редиректить после выхода

Эти параметры помогут сделать переходы между страницами более логичными.

Шаг 6: Тестируем всё!

  1. Переходите на /register/ и создавайте нового пользователя.
  2. После регистрации вас автоматически перенаправит на главную страницу (или куда вы указали в LOGIN_REDIRECT_URL).
  3. Перейдите на /login/ и войдите в систему.
  4. Перейдите на /restricted/ и убедитесь, что она доступна только для авторизованных пользователей.
  5. Выходите из системы через /logout/ и проверьте, что страница /restricted/ больше вам недоступна.

Вот и всё, у нас теперь есть базовая но функциональная система аутентификации! Вы только что создали основу, которую можно будет расширять, добавляя, например, двухфакторную аутентификацию или социальные логины через Google или Facebook.

Теперь вы знаете, как строить аутентификацию с нуля. Это не просто нужный и практичный навык, но и один из самых популярных вопросов на собеседованиях.

1
Задача
Модуль 3: Django, 15 уровень, 9 лекция
Недоступна
Создание views и URL для регистрации.
Создание views и URL для регистрации.
1
Задача
Модуль 3: Django, 15 уровень, 9 лекция
Недоступна
Интеграция входа и выхода из системы.
Интеграция входа и выхода из системы.
3
Опрос
Использование встроенных представлений аутентификации., 15 уровень, 9 лекция
Недоступен
Использование встроенных представлений аутентификации.
Использование встроенных представлений аутентификации.
Комментарии (2)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Андрей Уровень 60
7 декабря 2025
class UserRegistrationForm(forms.ModelForm): Зачем использовать forms.ModelForm, если можно сразу UserCreationForm
Александр Уровень 67
3 декабря 2025
В тесте: Вопрос: Какие из следующих представлений используются для изменения пароля? Правильный ответ: PasswordChangeView не принимается, как правильный.