Аутентификация в Django: полный пример входа, выхода и смены пароля
В этом руководстве вы узнаете, как легко добавить полноценную систему аутентификации приложение Django с функциями входа в систему, выхода из системы, смены пароля и сброса.
Мы будем использовать Django с базой данных MySQL.
Мы также будем использовать django-crispy-forms и Bootstrap 4 для стилизации пользовательского интерфейса приложения.
Что нужно знать
Давайте начнем с определением знаний для использования этого урока. Чтобы выполнить пошаговое руководство, вам необходимо выполнить несколько требований, таких как:
- базовые знания Python,
- знания Django (
django-admin.py
andmanage.py
), - должна быть установлена последняя версия Python 3 (сейчас это 3.7),
- база данных MySQL установлена в вашей системе.
Мы будем использовать pip
и venv
, которые связаны в виде модулей в последних версиях Python, поэтому вам не нужно устанавливать их, если вы не работаете со старыми версиями.
Если вы готовы, давайте начнем!
Создание вирутального окружения
Виртуальная среда позволяет вам изолировать ваши текущие зависимости проекта от остальных пакетов, установленных глобально в вашей системе или в других виртуальных средах. Вы можете использовать virtualenv
, который необходимо установить в вашей системе, или модуль venv, доступный в последних версиях Python 3.
Перейдите к своему командному терминалу и запустите:
$ python -m venv env
Затем активируйте созданное окружение:
$ source env/bin/activate
Примечание: обратите внимание, что в Windows вам нужно использовать
source env/Scripts/activate
для активации вашей виртуальной среды.
После активации окружения установите Django с помощью pip
:
$ pip install django
Если инфраструктура успешно установлена, то теперь вы можете использовать команды управления Django для создания и работы с вашим проектом.
Нам также необходимо установить mysql-client
с помощью:
$ pip install mysqlclient
Создание базы данных MySQL
Мы будем использовать базу данных MySQL. В терминале вызовите клиент mysql, используя следующую команду:
$ mysql -u root -p
Введите свой пароль MySQL и нажмите Enter.
Затем выполните следующую инструкцию SQL для создания базы данных:
mysql> create database mydb;
Создание проекта Django
Давайте теперь создадим проект, используя django-admin.py
. В терминале выполните следующую команду:
$ django-admin.py startproject demoproject
В Django есть средство для работы с БД — ORM
, который абстрагирует операции с базой данных напрямую и поддерживает SQLite, который настроен по умолчанию в проекте.
Если вам нужно использовать в своем проекте Django PostgreSQL, MySQL или любую другую систему управления базами данных, вам нужно сначала установить ее, а затем открыть файл settings.py
вашего проекта и добавить адрес базы данных и учетные данные в объект DATABASES
.
Вот конфигурация для MySQL:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mydb',
'USER': 'root',
'PASSWORD': 'YOUR_DB_PASSWORD',
'HOST': 'localhost',
'PORT': '3306',
}
}
Обязательно замените YOUR_DB_PASSWORD
своим собственным паролем MySQL.
Добавление django-crispy-forms
Мы будем использовать Bootstrap 4 для стилизации форм аутентификации, поэтому вам нужно установить его с помощью pip
:
$ pip install django-crispy-forms
Затем откройте файл settings.py
и добавьте приложение в установленные приложения:
INSTALLED_APPS = [
# [...]
'crispy_forms'
]
Затем добавьте следующий параметр, который устанавливает Bootstrap 4 в качестве структуры стилей по умолчанию для django-crispy-forms
:
CRISPY_TEMPLATE_PACK = 'bootstrap4'
Создание приложения accounts
Приложения — это способ организации проекта в Django. Думайте о них как о модулях.
Давайте инкапсулируем логику аутентификации, необходимую в нашем проекте, в приложение учетных записей. Выможете использовать любое имя, которое считаете подходящим.
Перейдите в свой терминал и перейдите в папку вашего проекта, если вы еще этого не сделали:
$ cd demoproject
Затем создайте приложение, используя manage.py:
$ python manage.py startapp accounts
manage.py
— еще один крипт управления для Django, который находится в корневом каталоге проекта. Он предоставляет хорошую оболочку для наиболее часто используемых команд управления проектом на Django.
Предыдущая команда создаст приложение Django с файловой структурой по умолчанию. Чтобы сделать это приложение частью вашего проекта, вам нужно открыть файл settings.py
и добавить его в INSTALLED_APPS
:
INSTALLED_APPS = [
# [...]
'accounts'
]
Теперь вы можете создать свою базу данных и запустить сервер разработки Django, используя следующие команды:
$ python manage.py migrate
$ python manage.py runserver
Вы можете использовать свой браузер, чтобы перейти по адресу localhost:8000
и увидеть, как работает ваше веб-приложение.
Встроенное приложение auth
Приложение auth
- это встроенная система аутентификации в Django, которая позволяет разработчикам добавлять аутентификацию в свои приложения, не изобретая велосипед, пытаясь реализовать базовую функциональность с нуля.
Приложение аутентификации Django предоставляет следующие функциональные возможности из «коробки»:
- Класс авторизации
LoginView
, - Класс выхода
LogoutView
, - Сброс пароля
PasswordResetView
, - Смена пароля
PasswordChangeView
,
Вам нужно только предоставить шаблоны для реализации этих функций в вашем приложении.
Для регистрации пользователей необходимо создать свой вид и шаблон.
Вам нужно проверить, приложение django.contrib.auth
указано в INSTALLED_APPS
файла settings.py
, который используется по умолчанию.
Затем создайте файл urls.py
в приложении учетных записей и добавьте следующий код:
from django.contrib.auth import views
from django.urls import path
urlpatterns = [
]
Авторизация пользователей с помощью LoginView
Вы можете войти в систему в приложении Django, используя представление на основе классов LoginView
. В ваш accounts/urls.py
добавьте следующий путь:
urlpatterns = [
path('login/', views.LoginView.as_view(), name='login'),
Вы просто используете метод as_view()
класса LoginView, чтобы вернуть объект обратного вызова, который может быть назначен в качестве функции представления функции path()
.
Далее вам нужно предоставить шаблон для вашего входа в систему. Создайте папку с шаблонами в корне приложения ваших учетных записей и добавьте файл base.html
со следующим кодом:
<!doctype html>
<html lang="en">
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<title>Django Authentication Example</title>
</head>
<body>
<div class="container">
<div class="row justify-content-center">
<div class="col-4">
<h1 class="text-center">Django Authentication Example</h1>
{% block main %}
{% endblock %}
</div>
</div>
</div>
</body>
</html>
Сначала мы импортируем Bootstrap 4 в наш базовый HTML-шаблон. Затем мы создаем контейнер <div>
заголовок и основной блок main
, где Django отображает другие части наших шаблонов.
Затем создайте папку templates/registration
и шаблон login.html
со следующим кодом:
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block main %}
<div class="card">
<div class="card-body">
<h4 class="card-title">Log in to your account</h4>
<form method="post">
{% csrf_token %}
<input type="hidden" name="next" value="{{ next }}">
{{ form|crispy }}
<button type="submit" class="btn btn-primary btn-block">Log in</button>
</form>
</div>
</div>
{% endblock %}
Мы расширяем предыдущий базовый шаблон, загружаем crispy_forms_tags
и затем перезаписываем основной блок main
, чтобы добавить нашу форму входа.
Затем мы создаем HTML-форму с помощью метода POST и визуализируем поля формы с помощью фильтра crispy
, который применяет стили Bootstrap к отдельным полям.
csrf_token
добавляет поле для защиты CSRF в форму входа в систему.
Мы также добавляем скрытое поле формы, содержащее следующий URL-адрес, который будет использоваться Django для перенаправления пользователя на следующую страницу после успешного входа в систему. По умолчанию он перенаправляет на URL-адрес accounts/profile
.
Настройка URL для редиректа после авторизации
Вы можете установить URL перенаправления с помощью параметра LOGIN_REDIRECT_URL
. Откройте файл settings.py
и добавьте:
LOGIN_REDIRECT_URL = '/'
Для проверки представления входа в систему вы можете создать пользователя с помощью команды manage.py createsuperuser
из своего терминала.
Примечание. После входа в систему вы будете перенаправлены на URL-адрес
/accounts/profile
.
Это скриншот формы входа в систему с Bootstrap 4:
Выход пользователя с помощью LogoutView
Вы можете выйти из системы в вашем приложении, используя представление на основе классов LogoutView
. В своем файле accounts.py
добавьте путь logout/
и свяжите его с вызываемым представлением LogoutView
:
path('logout/', views.LogoutView.as_view(), name='logout'),
Мы снова используем метод as_view()
для возврата вызываемого объекта из класса LogoutView
.
Далее вам нужно создать файл registration/logged_out.html
со следующим кодом:
{% extends 'base.html' %}
{% block main %}
<p>You are logged out!</p>
<a href="{% url 'login' %}">Log in again</a>
{% endblock %}
Это снимок экрана с завершенным выходом:
Сброс пароля: PasswordResetView
, PasswordResetDoneView
, PasswordResetConfirmView
and PasswordResetCompleteView
Вы можете разрешить своим пользователям сбрасывать свои пароли, используя множество представлений:
В своем файле accounts/urls.py
добавьте следующие пути:
path('password-reset/', views.PasswordResetView.as_view(), name='password_reset'),
path('password-reset/done/', views.PasswordResetDoneView.as_view(), name='password_reset_done'),
path('reset/<uidb64>/<token>/', views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
path('reset/done/', views.PasswordResetCompleteView.as_view(), name='password_reset_complete'),
Затем вам нужно добавить шаблон registration/password_reset_form.html
со следующим кодом:
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block main %}
<div class="card">
<div class="card-body">
<h4 class="card-title">Reset your password</h4>
<form method="post">
{% csrf_token %}
<input type="hidden" name="next" value="{{ next }}">
{{ form|crispy }}
<button type="submit" class="btn btn-primary btn-block">Reset</button>
</form>
</div>
</div>
</div>
{% endblock %}
Таким же образом, вам нужно добавить шаблоны password_reset_confirm.html
, password_reset_done.html
, password_reset_email.html
и password_reset_complete.html
.
Это скриншот формы сброса пароля со стилями Bootstrap 4:
Смена пароля: PasswordChangeView
и PasswordChangeDoneView
Вы можете разрешить своим пользователям изменять свои пароли с помощью представлений на основе классов PasswordChangeView
и PasswordChangeDoneView
.
В своем файле accounts/urls.py
добавьте следующие пути:
path('password-change/', views.PasswordChangeView.as_view(), name='password_change'),
path('password-change/done/', views.PasswordChangeDoneView.as_view(), name='password_change_done'),
Затем создайте шаблон registration/password_change_form.html
и добавьте следующий код:
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block main %}
<div class="card">
<div class="card-body">
<h4 class="card-title"> Change your password</h4>
<form method="post">
{% csrf_token %}
{{ form|crispy }}
<button type="submit" class="btn btn-success">Change password </button>
</form>
</div>
</div>
{% endblock %}
Вам также необходимо добавить шаблон password_change_done.html
.
Это скриншот формы смены пароля:
Регистрация пользователей
Для регистрации пользователей встроенное приложение аутентификации Django не предоставляет готовую функцию или представление на основе классов, поэтому вам необходимо создать собственную реализацию регистрации.
Импорт URL в основой urls.py
вашего проекта
Вы добавили различные URL-адреса для реализации аутентификации в вашем приложении учетных записей, но их нельзя использовать, пока вы не добавите их в файл уровня проекта urls.py
.
Во-первых, вот полный файл accounts/urls.py
:
from django.contrib.auth import views
from django.urls import path
urlpatterns = [
path('login/', views.LoginView.as_view(), name='login'),
path('logout/', views.LogoutView.as_view(), name='logout'),
path('password-change/', views.PasswordChangeView.as_view(), name='password_change'),
path('password-change/done/', views.PasswordChangeDoneView.as_view(), name='password_change_done'),
path('password-reset/', views.PasswordResetView.as_view(), name='password_reset'),
path('password-reset/done/', views.PasswordResetDoneView.as_view(), name='password_reset_done'),
path('reset/<uidb64>/<token>/', views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
path('reset/done/', views.PasswordResetCompleteView.as_view(), name='password_reset_complete'),
]
Затем откройте файл urls.py
, который находится в базовом каталоге вашего проекта, и используйте функцию include()
для импорта URL-адресов учетных записей:
from django.urls import path, include
urlpatterns = [
path('accounts/', include('accounts.urls'))
]
Теперь запустите сервер разработки. Вы можете использовать аутентификационные URL-адреса по адресу /accounts
:
http://127.0.0.1:8000/accounts/login/
для входа,http://127.0.0.1:8000/accounts/logout/
для выхода,http://127.0.0.1:8000/accounts/password-change/
для смены пароля,http://127.0.0.1:8000/accounts/password-reset/
для сброс пароля.
Заключение
В этом уроке мы увидели, как можно легко добавлять функции входа в систему, выхода из системы, сброса пароля и изменения функций в наших приложениях Django, используя приложение auth
, не изобретая велосипед.
Мы также использовали Bootstrap 4 и django-crispy-forms
для стилизации различных форм для входа в систему, смены пароля и сброса.
Перевод статьи https://www.techiediaries.com/django-authentication/
Вернуться на верх