Аутентификация в Django: полный пример входа, выхода и смены пароля

В этом руководстве вы узнаете, как легко добавить полноценную систему аутентификации приложение Django с функциями входа в систему, выхода из системы, смены пароля и сброса.

Мы будем использовать Django с базой данных MySQL.

Мы также будем использовать django-crispy-forms и Bootstrap 4 для стилизации пользовательского интерфейса приложения.

Что нужно знать

Давайте начнем с определением знаний для использования этого урока. Чтобы выполнить пошаговое руководство, вам необходимо выполнить несколько требований, таких как:

  • базовые знания Python,
  • знания Django (django-admin.py and manage.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 предоставляет следующие функциональные возможности из «коробки»:

Вам нужно только предоставить шаблоны для реализации этих функций в вашем приложении.

Для регистрации пользователей необходимо создать свой вид и шаблон.

Вам нужно проверить, приложение 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:

Django login form

Выход пользователя с помощью 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 %}

Это снимок экрана с завершенным выходом:

Django logout done

Сброс пароля: 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:

Django password reset form

Смена пароля: 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 password change form

Регистрация пользователей

Для регистрации пользователей встроенное приложение аутентификации 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:

Заключение

В этом уроке мы увидели, как можно легко добавлять функции входа в систему, выхода из системы, сброса пароля и изменения функций в наших приложениях Django, используя приложение auth, не изобретая велосипед.

Мы также использовали Bootstrap 4 и django-crispy-forms для стилизации различных форм для входа в систему, смены пароля и сброса.

Перевод статьи https://www.techiediaries.com/django-authentication/

Вернуться на верх