Вбудовані представлення аутентифікації в Django — це готовий функціонал, який дозволяє реалізувати ключові аспекти аутентифікації без необхідності писати все з нуля. Вони включають в себе:
- Вхід (login),
- Вихід (logout),
- Відновлення пароля (passwordreset, passwordreset_confirm та інші).
Ці представлення не тільки скорочують обсяг коду, який вам доведеться писати, але й одразу надають перевірені та безпечні рішення. Крім того, їх можна легко кастомізувати, щоб відповідати особливостям вашого додатка.
Основні вбудовані представлення
LoginView. Використовується для обробки процесу входу користувача в систему.
LogoutView. Надає функціонал виходу користувача.
PasswordResetView. Надсилає лист з інструкціями для відновлення пароля.
PasswordChangeView. Дозволяє авторизованому користувачу змінити пароль.
PasswordResetConfirmView. Обробляє посилання з листа відновлення пароля.
Використання вбудованих представлень:
Як приклад створимо додаток, який включає в себе авторизацію, вихід та базову роботу з відновленням пароля. На цьому етапі у нас вже має бути налаштований проект Django з підключеною базою даних і доданим додатком accounts.
Налаштування URLConf для аутентифікації
Django надає готові маршрути для вбудованих представлень. Ми імпортуємо їх із модуля django.contrib.auth.views:
# accounts/urls.py
from django.urls import path
from django.contrib.auth import views as auth_views
urlpatterns = [
# Вхід
path('login/', auth_views.LoginView.as_view(template_name='accounts/login.html'), name='login'),
# Вихід
path('logout/', auth_views.LogoutView.as_view(), name='logout'),
# Відновлення пароля
path('password-reset/', auth_views.PasswordResetView.as_view(template_name='accounts/password_reset.html'), name='password_reset'),
# Підтвердження скидання пароля
path('password-reset/done/', auth_views.PasswordResetDoneView.as_view(template_name='accounts/password_reset_done.html'), name='password_reset_done'),
# Вхід за посиланням з листа
path('password-reset-confirm/<uidb64>/<token>/', auth_views.PasswordResetConfirmView.as_view(template_name='accounts/password_reset_confirm.html'), name='password_reset_confirm'),
# Завершення відновлення пароля
path('password-reset-complete/', auth_views.PasswordResetCompleteView.as_view(template_name='accounts/password_reset_complete.html'), name='password_reset_complete'),
]
Шаблони для вбудованих представлень
Кожне вбудоване представлення може використовувати ваш власний HTML-шаблон. У прикладах вище ми вказали template_name, щоб вказати на користувацькі шаблони. Створимо їх по черзі.
Шаблон для сторінки входу login.html
<!-- templates/accounts/login.html -->
{% extends 'base.html' %}
{% block content %}
<h2>Вхід у систему</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Увійти</button>
</form>
{% endblock %}
Шаблон для сторінки відновлення пароля password_reset.html
>!-- templates/accounts/password_reset.html -->
{% extends 'base.html' %}
{% block content %}
>h2>Відновлення пароля>/h2>
>p>Введіть вашу електронну адресу, і ми надішлемо вам інструкції для скидання пароля.>/p>
>form method="post">
{% csrf_token %}
{{ form.as_p }}
>button type="submit">Надіслати>/button>
>/form>
{% endblock %}
Інші шаблони
За таким самим принципом створюємо password_reset_done.html, password_reset_confirm.html і password_reset_complete.html. Ці сторінки в основному відображають прості інструкції.
Налаштування редиректів
Після успішного входу, виходу або відновлення пароля потрібно налаштувати редиректи на потрібні сторінки.
Редирект після входу
У settings.py можна налаштувати URL, куди користувач перенаправляється після авторизації.
# settings.py
LOGIN_REDIRECT_URL = '/'
За замовчуванням, LOGIN_REDIRECT_URL встановлений у /accounts/profile/. Якщо ви не хочете, щоб користувач потрапляв на цей шлях (який може бути не налаштований), обов'язково вкажіть свій URL.
Редирект після виходу
Аналогічно можна вказати, куди перенаправляти користувача після виходу:
# settings.py
LOGOUT_REDIRECT_URL = '/login/'
Увімкнення вбудованих сторінок
Django автоматично постачає деякі вбудовані шаблони для функціоналу автентифікації. Якщо вам достатньо дефолтного функціоналу, додайте в urls.py стандартні маршрути автентифікації:
# project/urls.py
from django.contrib.auth import urls as auth_urls
urlpatterns = [
# Інші маршрути...
path('accounts/', include(auth_urls)),
]
Це додасть такі шляхи, як /accounts/login/, /accounts/logout/, /accounts/password-reset/ та інші. Однак ми все ж рекомендуємо явно прописувати маршрути, щоб у разі необхідності легко їх кастомізувати.
Робота з безпекою
Вбудовані представлення Django вже включають захист від найбільш поширених атак:
- CSRF-захист: всі POST-запити вимагають наявності CSRF-токена, який автоматично створюється та валідовується.
- Безпека паролів: Django використовує надійний парольний хеш через бібліотеку
pbkdf2. - Логування помилок: у разі невдалих спроб входу або відновлення Django надає готові механізми сповіщення.
Важливо також використовувати HTTPS для передачі даних із форм (особливо для форм входу та відновлення пароля).
Кастомізація вбудованих представлень
Хоча вбудовані представлення вже зручні, іноді виникає необхідність їх модифікації. Наприклад, вам може знадобитися додати додаткові дані в контекст шаблону.
Приклад кастомізації LoginView
from django.contrib.auth.views import LoginView
class CustomLoginView(LoginView):
template_name = 'accounts/login.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['title'] = 'Ласкаво просимо! Будь ласка, увійдіть.'
return context
Тепер замість базового LoginView у urls.py вказуємо кастомний клас:
path('login/', CustomLoginView.as_view(), name='login'),
Сценарії використання та реальні приклади
Використання вбудованих представлень ідеально підходить для MVP (мінімально життєздатного продукту). Наприклад, можна швидко налаштувати:
- Вхід і авторизацію для адміністративного інтерфейсу.
- Автоматичне відновлення пароля для користувачів.
- Швидке тестування захисних механізмів (наприклад, за допомогою Django Debug Toolbar).
На реальних проєктах вбудовані представлення:
- Скорочують час розробки (особливо коли потрібно реалізувати стандартний функціонал).
- Зменшують ймовірність виникнення помилок (оскільки це перевірені часом компоненти).
- Легко кастомізуються, що робить їх підходящими як для невеликих додатків, так і для великих корпоративних систем.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ