На цій лекції у нас не буде довгих теоретичних вступів — тільки код, практика і невелика творча агонія (без неї програмування неможливе!). Ми будемо будувати систему аутентифікації для нашого 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.
Тепер ви знаєте, як будувати аутентифікацію з нуля. Це не просто потрібний і практичний навик, але й одне з найпопулярніших питань на співбесідах.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ