На этой лекции у нас не будет длинных теоретических вступлений — только код, практика и небольшая творческая агония (без неё программирование невозможно!). Мы будем строить систему аутентификации для нашего Django-приложения. Вы уже знаете, что это такое, как это работает и какие кирпичики есть в Django для её реализации. Сегодня всё соберём воедино.
Структура задачи
Сегодня мы сделаем:
- Создание формы регистрации пользователя.
- Создание системы входа и выхода из аккаунта.
- Добавим ограничение доступа к некоторым страницам.
- Настроим редиректы для большей логики работы.
- Создадим шаблоны для всех этапов аутентификации.
Давайте начнём!
Шаг 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: Тестируем всё!
- Переходите на
/register/и создавайте нового пользователя. - После регистрации вас автоматически перенаправит на главную страницу (или куда вы указали в
LOGIN_REDIRECT_URL). - Перейдите на
/login/и войдите в систему. - Перейдите на
/restricted/и убедитесь, что она доступна только для авторизованных пользователей. - Выходите из системы через
/logout/и проверьте, что страница/restricted/больше вам недоступна.
Вот и всё, у нас теперь есть базовая но функциональная система аутентификации! Вы только что создали основу, которую можно будет расширять, добавляя, например, двухфакторную аутентификацию или социальные логины через Google или Facebook.
Теперь вы знаете, как строить аутентификацию с нуля. Это не просто нужный и практичный навык, но и один из самых популярных вопросов на собеседованиях.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ