У цій лекції ми будемо створювати сторінку входу для нашого Django-додатка. Настав час зробити так, щоб користувачі могли авторизуватися та використовувати персоналізований функціонал. Влаштуємо цю магію аутентифікації, використовуючи вбудовані інструменти Django.
Створення форми логіну
Перш за все, щоб користувач міг увійти в систему, нам потрібна форма, яка збирає його логін і пароль. Django вже постачається з повною вбудованою магією для форм (ура!), тому ми скористаємося вбудованою формою AuthenticationForm.
Додамо форму логіну. Для початку, створимо новий файл forms.py у папці нашого додатку (якщо він ще не існує). Тут ми імпортуємо AuthenticationForm і кастомізуємо її, якщо захочемо.
Приклад коду: forms.py
from django.contrib.auth.forms import AuthenticationForm
from django import forms
# Кастомізуємо форму логіну, якщо необхідно
class CustomAuthenticationForm(AuthenticationForm):
username = forms.CharField(
label="Логін",
widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Введіть логін'})
)
password = forms.CharField(
label="Пароль",
widget=forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Введіть пароль'})
)
Ми додали стилізацію для полів форми, щоб пізніше радувати око в наших шаблонах. Зверніть увагу, що ми використовуємо класи Bootstrap (form-control) для зручної стилізації.
Створення представлення для входу
Тепер, коли форма у нас готова, логічним кроком буде створення представлення, яке буде обробляти запити на вхід. Django надає вбудоване представлення LoginView, але ми також можемо написати власне представлення, якщо хочемо. Почнемо з простого!
Django робить життя простішим, пропонуючи LoginView. Його можна швидко та легко налаштувати:
Приклад коду: views.py
from django.contrib.auth.views import LoginView
from .forms import CustomAuthenticationForm
class CustomLoginView(LoginView):
template_name = 'login.html' # Вказуємо шаблон для відображення сторінки входу
authentication_form = CustomAuthenticationForm # Підключаємо нашу кастомну форму
LoginView сам обробляє як GET-запити (показуючи форму), так і POST-запити (при відправці даних). Це позбавляє нас від написання зайвого коду, що дозволяє фокусуватися на користувацькому досвіді.
Шаблон сторінки входу
Нам залишилося створити HTML-шаблон для сторінки входу. Використовуємо Django Template Language (DTL), щоб зв'язати форму і відобразити помилки у разі неправильного введення даних.
Приклад шаблону login.html
Шаблони зазвичай зберігаються в папці templates нашого додатку або у центральній директорії проєкту. Для зручності створимо файл login.html.
{% extends "base.html" %}
{% block content %}
<div class="container mt-5">
<h2>Вхід в систему</h2>
<form method="post">
{% csrf_token %}
{{ form.non_field_errors }}
<div class="form-group">
{{ form.username.label_tag }}
{{ form.username }}
{{ form.username.errors }}
</div>
<div class="form-group">
{{ form.password.label_tag }}
{{ form.password }}
{{ form.password.errors }}
</div>
<button type="submit" class="btn btn-primary">Увійти</button>
</form>
<p class="mt-3">
Немає акаунта? <a href="{% url 'register' %}">Реєстрація</a>
</p>
</div>
{% endblock %}
Тут ми використовуємо стандартну форму, передану з представлення: form.username, form.password і т.д. Форма автоматично включає помилки, якщо є некоректне введення.
Не забудьте додати {% csrf_token %} для захисту від CSRF-атак.
Налаштування URL для входу
Тепер нам потрібно налаштувати маршрут (URLConf), щоб наш додаток знав, куди користувачеві йти для входу. Для цього відкриємо файл urls.py нашого додатку.
Приклад коду: urls.py
from django.urls import path
from .views import CustomLoginView
urlpatterns = [
path('login/', CustomLoginView.as_view(), name='login'),
]
Ось і все! Тепер користувачі можуть перейти за /login/, щоб побачити магію авторизації в дії.
Налаштування редиректів після входу
Коли користувач успішно входить у систему, його зазвичай перенаправляють на головну сторінку або іншу сторінку за замовчуванням. Django дозволяє легко налаштувати це через параметр LOGIN_REDIRECT_URL у файлі налаштувань (settings.py).
Файл settings.py:
# Додаємо налаштування редиректів
LOGIN_REDIRECT_URL = '/'
Якщо ви хочете надати гнучкість, можна використовувати параметр next в URL, щоб користувач потрапляв туди, куди він і планував.
Приклад використання next у шаблоні:
<input type="hidden" name="next" value="{{ request.GET.next }}">
Обробка помилок входу
Коли користувач вводить неправильний логін або пароль, важливо чітко повідомити його про це. Django автоматично передає помилки через форму. Ми вже врахували це в шаблоні за допомогою конструкції {{ form.non_field_errors }}, яка відображає повідомлення про помилки.
Однак, якщо ти хочеш більш тонкого налаштування, можна додатково реалізувати логування кожної спроби входу для кращої безпеки. Це робиться через стандартний модуль Python logging.
Приклад логування помилок:
import logging
logger = logging.getLogger(__name__)
class CustomLoginView(LoginView):
def form_invalid(self, form):
logger.warning(f"Невдала спроба входу: {form.errors}")
return super().form_invalid(form)
Про що важливо пам'ятати?
- Безпека даних: завжди використовуй HTTPS у продакшн-середовищі, щоб шифрувати дані, які передаються між клієнтами та сервером.
- Не зберігай паролі у відкритому вигляді: Django вже забезпечує безпечне хешування паролів через вбудовані механізми.
- Аутентифікація — це не все: після логіну важливо передбачити авторизацію, яка обмежує доступ користувачів до певних ресурсів.
Вітаю, ти щойно реалізував повноцінну сторінку логіну для свого додатку. Попереду нас чекає ще більше захоплюючих тем, наприклад, реєстрація нових користувачів та обробка їхніх даних. Готуйся до нового витка функціоналу! 🚀
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ