Начало работы с управлением пользователями Django
Оглавление
- Начните с основ
- Настройка системы управления пользователями Django
- Работа с Django Auth
- Обрабатывать пароли
- Повторно активируйте средство проверки пароля
- Заключение
- Часто задаваемые вопросы
Управление пользователями Django позволяет интегрировать аутентификацию пользователей и управление ими в ваши веб-приложения. Используя Django, вы можете использовать встроенную в платформу систему аутентификации для управления регистрацией, входом в систему и выходом из системы. С помощью всего лишь нескольких дополнительных шаблонов вы можете разрешить пользователям самостоятельно сбрасывать и изменять свои пароли.
Это руководство поможет вам настроить базовую систему управления пользователями с помощью Django, которую вы сможете расширить позже. Вы узнаете, как создать панель мониторинга, реализовать регистрацию пользователей и подключить URL-адреса для аутентификации, а также настроить шаблоны для входа в систему, выхода из системы и управления паролями.
К концу этого урока вы поймете, что:
- Аутентификация пользователя в Django - это встроенная система аутентификации, которая поставляется с предварительно настроенными URL-адресами и представлениями.
- Аутентификация проверяет личность пользователя, в то время как авторизация определяет права пользователя в Django.
- Регистрация в качестве пользователя в Django требует настройки представлений, шаблонов и URL-адресов.
- Создание системы входа в систему в Django включает в себя встроенные представления аутентификации и создание пользовательских шаблонов.
- Сброс паролей в Django включает в себя настройку серверов электронной почты для отправки ссылок на сброс.
В этом руководстве основное внимание уделяется аутентификации пользователей и управлению ими. Если вы хотите узнать больше о разрешениях и группах, то вы можете ознакомиться с руководством по управлению пользователями на сайте администратора Django.
Начните с основ
Для более крупных проектов вы можете рассмотреть возможность создания пользовательской модели пользователя. В этом руководстве вы будете использовать встроенную пользовательскую модель Django. Это отличное место для начала ознакомления с аутентификацией пользователя в целом.
В этом разделе руководства вы сначала создадите небольшой проект на Django с помощью users
приложения. Затем вы внесете некоторые изменения в средство проверки паролей на Django, чтобы сделать вашу разработку более удобной. Наконец, вы создадите пользователя с правами администратора, чтобы подтвердить свои настройки.
Настройка проекта Django
При работе с проектами на Python рекомендуется использовать виртуальную среду. Таким образом, вы всегда можете быть уверены, что команда python
указывает на правильную версию Python и что модули, необходимые для вашего проекта, имеют правильные версии. Чтобы узнать больше о создании виртуальных сред, ознакомьтесь с Виртуальные среды Python: Учебник для начинающих.
Выберите свою операционную систему ниже и используйте команду, зависящую от вашей платформы, для настройки виртуальной среды:
PS> python -m venv venv\
PS> .\venv\Scripts\activate
(venv) PS>
$ python -m venv venv/
$ source venv/bin/activate
(venv) $
С помощью приведенных выше команд вы создаете и активируете виртуальную среду с именем venv
, используя встроенный в Python модуль venv
. Заключенный в круглые скобки (venv)
перед приглашением означает, что вы успешно активировали виртуальную среду.
Теперь, когда среда готова, вы можете установить Django, запустить новый проект и создать приложение для хранения всего вашего кода управления пользователями:
(venv) $ python -m pip install Django
(venv) $ django-admin startproject user_auth_intro
(venv) $ cd user_auth_intro
(venv) $ python manage.py startapp users
В этом примере вы называете свой проект user_auth_intro
и свое приложение users
. Чтобы включить приложение users
в свой проект Django, вам необходимо добавить ссылку на класс конфигурации приложения в начале списка INSTALLED_APPS
в settings.py
:
user_auth_intro/settings.py
1# ...
2
3INSTALLED_APPS = [
4 "users.apps.UsersConfig",
5 "django.contrib.admin",
6 "django.contrib.auth",
7 "django.contrib.contenttypes",
8 "django.contrib.sessions",
9 "django.contrib.messages",
10 "django.contrib.staticfiles",
11]
12
13# ...
Добавляя users.apps.UsersConfig
, вы даете Django знать, что приложение users
, которое вы только что создали, существует. Если вы посмотрите на список INSTALLED_APPS
, то в строке 6 вы увидите систему аутентификации Django по умолчанию . В django.contrib.auth
Django хранит ядро своей платформы аутентификации и модели по умолчанию, которые вы будете использовать позже.
Затем примените миграции и запустите сервер разработки Django:
(venv) $ python manage.py migrate
(venv) $ python manage.py runserver
Эти команды создают все модели по умолчанию в базе данных и запускают сервер разработки Django.
Отключите средство проверки пароля
По умолчанию Django использует надежные пароли, чтобы сделать учетные записи пользователей менее уязвимыми для атак. Поскольку в этом руководстве вам придется часто менять пароли, каждый раз подбирать надежный пароль будет неудобно.
Чтобы устранить эту проблему, вы можете отключить средства проверки паролей в настройках. Просто закомментируйте их, оставив пустой список:
user_auth_intro/settings.py
# ...
AUTH_PASSWORD_VALIDATORS = [
# {
# "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",
# },
# {
# "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
# },
# {
# "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",
# },
# {
# "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",
# },
]
# ...
Теперь Django позволит вам устанавливать пароли типа pass
или даже 1234
, что значительно ускорит вашу работу с системой управления пользователями. Только не забудьте включить валидаторы в вашем реальном приложении!
Создайте пользователя Django Admin
Для этого руководства также было бы полезно иметь доступ к сайту администратора, чтобы вы могли отслеживать вновь созданных пользователей и их пароли. Продолжайте и создайте пользователя с правами администратора:
(venv) $ python manage.py createsuperuser
Username: admin
Email address: admin@example.com
Password: 1234
Password (again): 1234
Superuser created successfully.
Подобная настройка средств проверки паролей в Django делает работу с системой аутентификации более удобной. Например, вы можете использовать любой пароль, который вам нравится, для вашего пользователя admin. Как упоминалось ранее, вам нужно будет не забыть включить средства проверки паролей позже.
Если хотите, вы можете перейти на страницу http://127.0.0.1:8000/admin/
, чтобы убедиться, что вы можете войти на сайт администратора Django. При этом обратите внимание на формы и кнопки, с которыми вы сталкиваетесь в процессе входа в систему. Вы заново создадите аналогичный поток в своем приложении users
.
Настройка системы управления пользователями Django
В большинстве систем управления пользователями есть что-то вроде главной страницы, обычно называемой информационной панелью. На этой панели управления вы найдете ссылки для регистрации, входа в систему или выхода из системы в качестве пользователя.
В дополнение к информационной панели позже у вас появятся дополнительные страницы. Поэтому вы начнете с создания базового шаблона, от которого другие страницы смогут унаследовать согласованную структуру со своими дочерними шаблонами.
Создайте базовую структуру шаблона
Все шаблоны, которые вы используете в этом руководстве, вы разместите в каталоге users/templates/
. Каталог users/templates/
по умолчанию не существует, поэтому вам придется сначала создать его. Затем создайте base.html
со следующим содержимым:
users/templates/base.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>User Management Intro</title>
</head>
<body>
<h1>Welcome!</h1>
{% block content %}
{% endblock content %}
</body>
</html>
Базовый шаблон содержит базовую структуру типичного HTML-документа. В заголовке отображается сообщение Welcome!
, и вы определяете блок с именем content
. Пока этот блок пуст, но другие шаблоны собираются использовать его для добавления своего собственного контента.
Чтобы правильно упорядочить ваши шаблоны, чтобы Django мог их найти, создайте две папки для ваших дочерних шаблонов:
users/templates/users/
users/templates/registration/
Эта схема именования папок шаблонов позволяет аккуратно организовать ваши шаблоны. Подобная схема вложения папок шаблонов может показаться немного излишней, но она позволяет создавать шаблоны с одинаковыми именами во вложенных папках. В этом руководстве вы будете работать только с одним файлом базового шаблона, поэтому можно сохранить base.html
непосредственно в папке templates/
.
Добавить страницу панели мониторинга
Когда вы создаете новые страницы в Django, вам обычно требуется шаблон, представление, которое отображает шаблон, и URL-адрес, который использует это представление. Ваша страница панели мониторинга также проходит этот трехэтапный процесс создания. Поскольку вы еще не определили URL-адреса для приложения users
, есть еще четвертый шаг, позволяющий подключить URL-адреса из users
к вашему проекту на Django. Вы будете выполнять эти шаги один за другим!
Начните с создания шаблона для панели мониторинга. Поскольку этот шаблон предназначен для приложения users/
, вы сохраняете его в папке users/template/users/
. Название шаблона должно быть dashboard.html
, и оно должно расширять базовый шаблон:
users/templates/users/dashboard.html
{% extends "base.html" %}
{% block content %}
Hello, {{ user.username|default:"Guest" }}!
{% endblock content %}
На данный момент в шаблоне отображается только приветственное сообщение с именем текущего пользователя. Если пользователь не вошел в систему, Django все равно установит переменную user
, используя AnonymousUser
object. У Анонимного пользователя всегда пустое имя пользователя, поэтому на панели мониторинга будет отображаться Hello, Guest!
Затем создайте представление dashboard
в users/views.py
, которое отображает шаблон dashboard.html
:
users/views.py
from django.shortcuts import render
def dashboard(request):
return render(request, "users/dashboard.html")
Одна интересная деталь в представлении dashboard
заключается в том, что вы визуализируете шаблон, просто предоставляя объект request
. Тем не менее, Django сможет работать с переменной user
, которую вы используете в dashboard.html
, поскольку информация о пользователе хранится в RequestContext
. Через мгновение вы убедитесь в этом сами.
А пока продолжим, создав файл users/urls.py
и добавив путь для представления dashboard
:
users/urls.py
from django.urls import path
from . import views
urlpatterns = [
path("dashboard/", views.dashboard, name="dashboard"),
]
Наконец, добавьте URL-адреса вашего приложения к URL-адресам вашего проекта:
user_auth_intro/urls.py
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path("", include("users.urls")),
path("admin/", admin.site.urls),
]
Теперь вы можете протестировать панель мониторинга. Откройте http://127.0.0.1:8000/dashboard/
в вашем браузере. Вы должны увидеть экран, похожий на этот:
Это означает, что Django успешно поработал с переменной шаблона user
. В данном случае пользователь является анонимным пользователем, у которого нет свойства .username
, поэтому отображается Привет, гость!.
Примечание: Если на панели мониторинга отображается сообщение Привет, администратор!, вы можете выйти с сайта администратора и перейти на страницу снова панель управления, чтобы увидеть Привет, гость! сообщение.
Если вы не вошли в систему, то страница панели мониторинга приветствует вас как гостя. Когда вы открываете сайт администратора по адресу http://127.0.0.1:8000/admin/
и входите в систему как пользователь с правами администратора, ваша панель мониторинга теперь должна выглядеть немного по-другому, когда вы вернетесь к ней:
Как вы можете видеть, в вашем новом шаблоне корректно отображается имя пользователя, который в данный момент вошел в систему. В этом случае панель мониторинга приветствует вас как администратора. Это отличное начало!
Реализовать регистрацию пользователя
В настоящее время вы являетесь администратором проекта и можете войти в систему через форму входа на сайте администратора. Если вы хотите добавить новых пользователей в свой проект, вам нужно создать их самостоятельно. Это не очень практично. Вместо этого вы создадите страницу регистрации, на которой пользователи смогут зарегистрироваться самостоятельно.
Чтобы создать эту страницу, вам необходимо выполнить те же действия, что и для любой другой страницы в проекте Django. Начните с регистрации URL-адреса, который подключается к представлению, которое, в свою очередь, отображает шаблон. Начните с добавления URL-адреса “sign_up” в файл urls.py
в вашем приложении users
:
users/urls.py
from django.urls import path
from . import views
urlpatterns = [
path("dashboard/", views.dashboard, name="dashboard"),
path("sign_up/", views.sign_up, name="sign_up"),
]
Затем добавьте представление sign_up
, которое добавляет пользователя в базу данных при отправке регистрационной формы с запросом "POST"
:
users/views.py
1from django.contrib.auth import login
2from django.contrib.auth.forms import UserCreationForm
3from django.shortcuts import redirect, render
4from django.urls import reverse
5
6def dashboard(request):
7 return render(request, "users/dashboard.html")
8
9def sign_up(request):
10 if request.method == "POST":
11 form = UserCreationForm(request.POST)
12 if form.is_valid():
13 user = form.save()
14 login(request, user)
15 return redirect(reverse("dashboard"))
16 else:
17 form = UserCreationForm()
18 return render(request, "registration/sign_up.html", {"form": form})
Это представление очень типично для представления, которое работает с формами. Когда вы перейдете на страницу sign_up
с запросом "GET"
, вы увидите пустую форму, которую вы можете заполнить для регистрации. После отправки действительной формы с запросом вы сохраняете данные формы в своей базе данных. В этом случае создается новый пользователь. Затем вы перенаправляете запрос на страницу панели мониторинга.
После сохранения формы следует обратить внимание на одну важную деталь. В строке 14 вы используете функцию Django login()
для дополнительного входа пользователя в систему. Если бы вы удалили эту строку, вы бы зарегистрировали пользователя, но он бы не выходил из системы после регистрации. Использование login()
сэкономит вашим пользователям время и упростит процесс регистрации.
В строке 18 вы обслуживаете шаблон sign_up.html
из вложенной папки registration/
. Продолжайте и создайте sign_up.html
с таким содержимым:
users/templates/registration/sign_up.html
{% extends "base.html" %}
{% block content %}
<h2>Sign Up</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Sign Up" />
</form>
<p>
<a href="{% url 'dashboard' %}">Back to dashboard</a>
</p>
{% endblock content %}
На экране появится заголовок Зарегистрироваться, за которым последует форма входа в систему. Django использует словарь, также известный как контекст, для передачи данных в шаблон во время его рендеринга. В этом случае переменная с именем form
уже будет включена в контекст — все, что вам нужно сделать, это отобразить ее. Использование {{ form.as_p }}
приведет к отображению формы в виде последовательности абзацев HTML.
В строке {% csrf_token %}
вставлен токен для подделки межсайтовых запросов (CSRF), который требуется для каждой формы Django. Также есть кнопка для отправки формы и, в конце шаблона, ссылка, которая вернет ваших пользователей обратно на панель управления.
Примечание: В этом руководстве основное внимание уделяется структуре вашей системы управления пользователями и работе с нестилевыми шаблонами. Не стесняйтесь в любое время сделать паузу и добавить немного CSS в проект, чтобы он выглядел лучше.
Чтобы проверить, работает ли ваша страница регистрации, перейдите по ссылке http://127.0.0.1:8000/sign_up
и создайте нового пользователя.
После отправки регистрационной формы пользователь автоматически входит в систему, и его лично приветствуют на странице панели мониторинга. Поздравляем — теперь вы можете регистрировать новых пользователей! Далее вы добавите функциональность для входа и выхода из системы.
Работа с Django Auth
Полноценному веб-сайту требуется нечто большее, чем просто панель мониторинга для управления пользователями. К счастью, Django поставляется с системой аутентификации и системой авторизации, которые обычно сокращаются как Django auth чтобы охватить оба термина:
- Аутентификация: - Это процесс верификации для идентификации пользователя, например, логин.
- Авторизация: Это процесс определения того, что пользователю разрешено делать, например, после входа в систему.
В Django auth есть множество URL-адресов и представлений, связанных с управлением пользователями, которые отвечают за наиболее важные процессы, включая вход в систему, выход из системы, смену пароля и сброс пароля. Однако вам потребуется создать шаблоны, которые будут сопровождать эти процессы.
В этом разделе руководства вы сначала добавите URL-адреса для входа в свой проект и выхода из него. Затем вы позаботитесь обо всех шаблонах, чтобы упростить процесс авторизации для ваших пользователей.
Подключите аутентифицирующие URL-адреса и представления
Чтобы использовать встроенные в Django системы аутентификации и авторизации, вам необходимо работать с django.contrib.auth
. Вход - это URLconf модуля, что является сокращением от URL configuration. Первый шаг - добавить django.contrib.auth.urls
в меню вашего приложения. urls.py
:
users/urls.py
from django.urls import include, path
from . import views
urlpatterns = [
path("accounts/", include("django.contrib.auth.urls")),
path("dashboard/", views.dashboard, name="dashboard"),
path("sign_up/", views.sign_up, name="sign_up"),
]
Добавляя django.contrib.auth.urls
URLconf из Django в URL вашего user
приложения, вы автоматически добавляете в свой проект множество URL-адресов, таких как URL-адреса для входа и выхода пользователей. Каждому URL-адресу присваивается имя, которое вы позже сможете использовать в своих шаблонах, а представления, связанные с URL-адресами, позволят вам выполнить задачу аутентификации:
URL | Задача | Название |
---|---|---|
accounts/login/ |
Войдите как пользователь в свое приложение | "login" |
accounts/logout/ |
Выйдите из приложения | "logout" |
Кроме того, django.contrib.auth.urls
содержит URL-адреса для более сложных задач, таких как изменение и сброс паролей. Вы познакомитесь с ними позже в этом руководстве.
Теперь, когда URL-адреса accounts/
существуют в вашем приложении и они уже подключены к соответствующим представлениям в django.contrib.auth.views
, сделайте решительный шаг и посетите http://127.0.0.1:8000/accounts/login/
:
Ошибка TemplateDoesNotExist
ожидаема, поскольку вам необходимо создать шаблоны самостоятельно. Но, как и другие исключения Python, сообщение об ошибке на самом деле весьма полезно и дает вам две важные части информации:
- URL-адрес
"login"
содержитLoginView
. - В
LoginView
выполняется поиск шаблона вregistration/
с именемlogin.html
.
Вы можете перейти по другим URL-адресам и увидеть похожие сообщения об ошибках для большинства из них. Чтобы избавиться от ошибок, вы должны создать шаблоны, которые ожидаются в представлениях.
Если вы прокрутите страницу с сообщением об ошибке вниз, то сможете ознакомиться с разделом посмертный загрузчик шаблонов. Здесь вы можете видеть, что Django, в частности, пытается сначала загрузить шаблоны из пути users/templates/registration/
. Именно здесь вы создадите свои шаблоны управления пользователями.
Создайте страницу входа в систему
Для страницы входа в систему Django попытается использовать шаблон с именем login.html
, который находится внутри users/templates/registration/
. Внутри registration/
добавьте файл login.html
с таким содержимым:
users/templates/registration/login.html
{% extends "base.html" %}
{% block content %}
<h2>Login</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Login" />
</form>
<p>
<a href="{% url 'dashboard' %}">Back to dashboard</a>
</p>
{% endblock content %}
Шаблон вашей страницы входа в систему очень похож на шаблон вашей регистрации. Единственное отличие заключается в заголовке и значении кнопки. Кроме того, в форме будет отображаться только одно поле для ввода пароля по сравнению с формой регистрации, где вам необходимо повторить установленный вами пароль.
Когда вы снова зайдете на http://127.0.0.1:8000/accounts/login/
, то увидите, что Django успешно отрисовал вашу страницу входа в систему с новым шаблоном:
Используйте свои учетные данные администратора и выберите Войти. Не пугайтесь, если снова увидите сообщение об ошибке. Как и раньше, сообщение об ошибке содержит полезную информацию о том, что пошло не так:
Согласно сообщению об ошибке, Django не может найти путь для accounts/profile/
, который является пунктом назначения по умолчанию для ваших пользователей после успешного входа в систему. По-видимому, в Django отсутствует функция просмотра профиля. Но это не проблема, потому что у вас уже есть представление dashboard
, которое вы можете использовать повторно.
Перенаправлять логины
Django предоставляет вам два варианта изменения перенаправления по умолчанию после успешного входа в систему. Первый вариант - установить LOGIN_REDIRECT_URL
в вашем файле settings.py
в качестве предпочтительного URL-адреса, на который должен быть перенаправлен ваш запрос. Второй вариант - изменить форму вашего шаблона login.html
.
Как правило, корректировка LOGIN_REDIRECT_URL
является приемлемой стратегией. Но поскольку вы хотите перенаправить на страницу своей панели мониторинга, вам следует указать URL-адрес другого приложения в настройках вашего проекта. Если вы когда-нибудь в будущем решите удалить свое приложение users
из своего проекта Django, вам также нужно будет не забыть удалить или обновить LOGIN_REDIRECT_URL
.
Примечание: Если вы хотите попробовать настроить файл настроек, вам необходимо добавить LOGIN_REDIRECT_URL = "dashboard"
в settings.py
.
Настройка формы login.html
дает вам детальный контроль над тем, куда вы хотите перенаправить запрос после успешного входа в систему. Все, что вам нужно сделать, это настроить параметр next
, который вы отправляете вместе с формой.
Откройте login.html
и добавьте параметр next
с помощью скрытого поля ввода:
users/templates/registration/login.html
{% extends "base.html" %}
{% block content %}
<h2>Login</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Login" />
<input type="hidden" name="next" value="{% url 'dashboard' %}" />
</form>
<p>
<a href="{% url 'dashboard' %}">Back to dashboard</a>
</p>
{% endblock content %}
Теперь попробуйте войти в систему еще раз. Вы будете перенаправлены на страницу панели мониторинга, где вас встретят под вашим именем пользователя.
Разрешить выход из системы
Теперь ваши пользователи могут входить в систему, но они также должны иметь возможность выходить из системы. Этот процесс немного отличается от входа в систему. Если вы посмотрите на URL-адреса, которые предоставляет Django auth, вы увидите URL-адрес accounts/logout/
. Однако вы не должны переходить по этому URL-адресу в браузере, как вы это делали на странице входа в систему.
Примечание: В более ранних версиях Django вы могли выйти из системы с запросом GET, обратившись к accounts/logout/
. С выпуском Django 5.0 представление, расположенное за accounts/logout/
, принимает только запросы POST.
Вместо создания шаблона для представления выхода из системы вы должны создать форму, которая отправляет запрос post в accounts/logout/
. Затем вы можете включить эту форму в любое место, где хотите, чтобы обеспечить функциональность выхода из системы.
Чтобы указать, что шаблон выхода из системы должен быть включен в другие шаблоны, вы можете добавить к имени файла символ подчеркивания _
и присвоить ему имя _logout.html
. Сохраните шаблон рядом с login.html
и следуйте аналогичной схеме со скрытым полем:
users/templates/registration/_logout.html
1<form method="post" action="{% url 'logout' %}">
2 {% csrf_token %}
3 {{ form.as_p }}
4 <input type="submit" value="Logout" />
5 <input type="hidden" name="next" value="{% url 'dashboard' %}" />
6</form>
Поскольку предполагается, что шаблон будет включен в другие шаблоны и не будет отображаться независимо, вам не нужно расширять какие-либо другие шаблоны. Вместо этого вы просто добавляете код для формы.
В строке 1 вы также добавляете атрибут action
, указывающий браузеру, куда следует отправить запрос. Важно добавить сюда страницу "logout"
. В противном случае форма отправила бы запрос POST на тот же URL, на котором вы сейчас находитесь, и не вывела бы вас из системы.
Откройте dashboard.html
и введите форму _logout.html
:
users/templates/users/dashboard.html
{% extends "base.html" %}
{% block content %}
Hello, {{ user.username|default:"Guest" }}!
<hr />
{% include "registration/_logout.html" %}
{% endblock content %}
Когда вы перейдете на страницу http://127.0.0.1:8000/dashboard/
, вы увидите кнопку выхода из системы вашего пользователя:
В настоящее время процесс выхода из системы очень сложен. Когда вы нажимаете кнопку, вы видите, что ваше имя пользователя меняется на “Гость” в приветственном сообщении на панели мониторинга. Но кнопка выхода по-прежнему отображается даже после того, как вы вышли из системы. Итак, прежде чем завершить этот раздел, пришло время обновить панель мониторинга, чтобы отразить текущее состояние вашей системы управления пользователями.
Обновите панель мониторинга
На данный момент ваша панель мониторинга является довольно простой. Кнопка выхода присутствует всегда, даже если пользователи уже вышли из системы. Если вы хотите зарегистрироваться или войти в систему, вам необходимо перейти по URL-адресам, введя их в адресную строку браузера. Вы можете устранить эти неудобства, обновив шаблон панели мониторинга:
users/templates/users/dashboard.html
{% extends "base.html" %}
{% block content %}
Hello, {{ user.username|default:"Guest" }}!
<hr />
{% if user.is_authenticated %}
{% include "registration/_logout.html" %}
{% else %}
<a href="{% url 'login' %}">Login</a>
<a href="{% url 'sign_up' %}">Sign up</a>
{% endif %}
{% endblock content %}
Чтобы условно отобразить кнопку выхода из системы или ссылки для входа и регистрации, вы используете user.is_authenticated
. Если пользователь прошел аутентификацию, вы показываете кнопку выхода из системы. В противном случае отображаются ссылки на страницу входа в систему и страницу регистрации.
Вы можете посетить http://127.0.0.1:8000/dashboard/
и посмотреть, как работает обновленная панель мониторинга.
Когда пользователь выходит из системы, у него есть возможность войти в систему или зарегистрироваться. Если у них уже есть учетная запись, они могут нажать Войти и ввести свои учетные данные на странице входа в систему.
Для пользователей, у которых нет учетной записи, вы предоставляете им возможность зарегистрироваться. В обоих случаях пользователь входит в систему позже, после чего на панели мониторинга отображается кнопка выхода.
Это прекрасно! Похоже, теперь у вас есть функционирующая система управления пользователями. Пока пользователи помнят свои пароли, все будет хорошо.
Обработка паролей
В настоящее время в вашей системе управления пользователями отсутствуют две важные функции для обработки паролей:
- Смена пароля: Вы хотите иметь возможность время от времени менять свой пароль, чтобы обезопасить свою учетную запись.
- Сброс пароля: Если вы забыли свой пароль, вы хотите иметь возможность сбросить его.
Использование Django auth для управления пользователями дает вам преимущество в реализации функциональных возможностей для изменения и сброса паролей в вашем проекте.
Помните, когда вы включили django.contrib.auth.urls
URLconf из Django в URL вашего user
приложения, вы автоматически добавили кучу URL-адресов в свой проект? Например, он добавил URL-адреса для входа и выхода пользователей из системы. Кроме того, он также добавил эти URL-адреса для изменения и сброса паролей:
URL | Задача | Название |
---|---|---|
accounts/password_change/ |
Изменить пароль | "password_change" |
accounts/password_change/done/ |
Показывать подтверждение того, что пароль был изменен | "password_change_done" |
accounts/password_reset/ |
Запросите электронное письмо со ссылкой для сброса пароля | "password_reset" |
accounts/password_reset/done/ |
Показывать подтверждение отправки письма для сброса пароля | "password_reset_done" |
accounts/reset/<uidb64>/<token>/ |
Установите новый пароль, используя ссылку для сброса пароля. | "password_reset_confirm" |
accounts/reset/done/ |
Показывать подтверждение того, что пароль был сброшен | "password_reset_complete" |
Как и раньше, каждому URL-адресу присваивается имя, которое вы позже сможете использовать в своих шаблонах, а представления, связанные с URL-адресом, позволят вам выполнить задачу аутентификации. Давайте начнем со смены паролей!
Изменить пароли
В какой-то момент ваши пользователи могут захотеть сменить свои пароли. Вместо того, чтобы просить администратора сделать это за них, вы можете добавить форму смены пароля в свое приложение. Для выполнения этой работы Django нужны два шаблона:
registration/password_change_form.html
чтобы отобразилась форма смены пароля.registration/password_change_done.html
чтобы отобразить подтверждение того, что пароль был успешно изменен.
Начните с registration/password_change_form.html
:
users/templates/registration/password_change_form.html
{% extends "base.html" %}
{% block content %}
<h2>Change password</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Change" />
</form>
<a href="{% url 'dashboard' %}">Back to dashboard</a>
{% endblock content %}
Этот шаблон выглядит почти так же, как шаблон входа в систему, который вы создали ранее. Но на этот раз Django разместит здесь форму смены пароля, а не форму входа в систему, поэтому браузер будет отображать ее по-другому.
Другой шаблон, который вам нужно создать, это registration/password_change_done.html
:
users/templates/registration/password_change_done.html
{% extends "base.html" %}
{% block content %}
<h2>Password changed</h2>
<a href="{% url 'dashboard' %}">Back to dashboard</a>
{% endblock content %}
После смены пароля пользователь увидит страницу "password_change_done"
, чтобы убедиться, что смена пароля прошла успешно. Как и в случае с другими страницами, рекомендуется добавить ссылку на панель мониторинга.
Чтобы сделать процедуру смены пароля более доступной, добавьте ссылку на панели мониторинга в только что созданную форму смены пароля. Вам просто нужно убедиться, что она отображается только для пользователей, которые вошли в систему:
users/templates/users/dashboard.html
{% extends "base.html" %}
{% block content %}
Hello, {{ user.username|default:"Guest" }}!
<hr />
{% if user.is_authenticated %}
{% include "registration/_logout.html" %}
<a href="{% url 'password_change' %}">Change password</a>
{% else %}
<a href="{% url 'login' %}">Login</a>
<a href="{% url 'sign_up' %}">Sign up</a>
{% endif %}
{% endblock content %}
Если вы перейдете по ссылке в своем браузере, то увидите следующую форму:
Попробуйте. Измените пароль, выйдите из системы и снова войдите в систему. Вы также можете попробовать перейти на страницу смены пароля без входа в систему, перейдя по URL-адресу http://127.0.0.1:8000/accounts/password_change/
непосредственно в вашем браузере. Django достаточно умен, чтобы определить, что вы должны сначала войти в систему, и автоматически перенаправит вас на страницу входа в систему.
Запросить ссылки для сброса пароля
Ошибки случаются даже с лучшими из нас, и время от времени кто-то может забыть пароль. Ваша система управления пользователями Django также должна справиться с этой ситуацией. Эта функциональность немного сложнее, поскольку для работы со ссылками для сброса пароля необходимо выполнить три требования:
- Ваши пользователи должны указать адрес электронной почты при регистрации.
- У вас должен быть шаблон электронного письма для отправки.
- Ваше приложение должно иметь возможность отправлять электронные письма.
Пока что пользователю нужны только имя пользователя и пароль для регистрации в вашем приложении. Это хорошее начало. Однако, когда пользователь хочет сбросить свой пароль, просто запрашивать у него имя пользователя рискованно. Вместо этого вам нужно будет отправить электронное письмо на указанный адрес электронной почты. Такой подход гарантирует, что пользователи смогут самостоятельно сбросить пароли.
Чтобы запросить адрес электронной почты при регистрации, вам необходимо изменить регистрационную форму. Для этого создайте новый файл на Python с именем users/forms.py
и добавьте пользовательскую форму:
users/forms.py
from django.contrib.auth.forms import UserCreationForm
class CustomUserCreationForm(UserCreationForm):
class Meta(UserCreationForm.Meta):
fields = UserCreationForm.Meta.fields + ("email",)
В вашем недавно созданном файле forms.py
вы создаете CustomUserCreationForm
, который расширяет UserCreationForm
Django. Внутренний класс Meta
хранит дополнительную информацию о форме и, в данном случае, расширяет UserCreationForm.Meta
, так что почти все из формы Django будет использовано повторно.
Ключевым отличием является атрибут .fields
, который определяет поля, которые будут включены в форму. В вашей пользовательской форме будут использованы все поля из UserCreationForm
и добавлено поле email
.
Теперь, когда форма готова, обновите представление sign_up
в users/views.py
для работы с CustomUserCreationForm
:
users/views.py
from django.contrib.auth import login
# Remove: from django.contrib.auth.forms import UserCreationForm
from django.shortcuts import redirect, render
from django.urls import reverse
from .forms import CustomUserCreationForm
def dashboard(request):
return render(request, "users/dashboard.html")
def sign_up(request):
if request.method == "POST":
form = CustomUserCreationForm(request.POST)
if form.is_valid():
user = form.save()
login(request, user)
return redirect(reverse("dashboard"))
else:
form = CustomUserCreationForm()
return render(request, "registration/sign_up.html", {"form": form})
Вместо использования UserCreationForm
теперь вы работаете с CustomUserCreationForm
, который вы импортируете из forms.py
. Внутри sign_up()
вам нужно обновить значения form
, чтобы использовать CustomUserCreationForm
. Остальная часть sign_up
остается прежней.
Создайте нового пользователя, чтобы ознакомиться с обновленным процессом регистрации:
Отлично. Теперь, когда вам требуются адреса электронной почты для новых пользователей, вы можете продолжить и создать шаблон с именем password_reset_form.html
в registration/
:
users/templates/registration/password_reset_form.html
{% extends "base.html" %}
{% block content %}
<h2>Send password reset link</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Send Reset Link" />
</form>
<p>
<a href="{% url 'dashboard' %}">Back to dashboard</a>
</p>
{% endblock content %}
Этот шаблон будет доступен при посещении http://127.0.0.1:8000/accounts/password_reset/
. Также рекомендуется разместить ссылку на эту страницу на странице входа в систему:
users/templates/registration/login.html
{% extends "base.html" %}
{% block content %}
<h2>Login</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Login" />
<input type="hidden" name="next" value="{% url 'dashboard' %}" />
</form>
<p>
<a href="{% url 'password_reset' %}">Forgot your password?</a>
<a href="{% url 'dashboard' %}">Back to dashboard</a>
</p>
{% endblock content %}
Теперь, когда пользователь находится на странице входа в систему и забывает пароль, он может перейти по ссылке на страницу "password_reset"
. После того, как пользователь запрашивает ссылку для сброса, Django отправляет ссылку для сброса на указанный адрес электронной почты и перенаправляет пользователя на страницу "password_reset_done"
. Для этой страницы вам также необходимо создать шаблон:
users/templates/registration/password_reset_done.html
{% extends "base.html" %}
{% block content %}
<h2>Password reset link sent</h2>
<a href="{% url 'dashboard' %}">Back to dashboard</a>
{% endblock content %}
Название "password_reset_done"
немного вводит в заблуждение. На данный момент Django еще не сбросил пароль. Сброс пароля произойдет только после того, как пользователь перейдет по ссылке в электронном письме для сброса пароля, которое отправит Django.
Отправлять электронные письма для сброса пароля
Попробуйте запросить сброс пароля. В браузере, похоже, все работает так, как ожидалось. Но на данный момент Django фактически не отправляет никаких электронных писем. Для этого вам нужно будет настроить сервер электронной почты для вашего проекта.
В Django существуют различные виды бэкэндов электронной почты. Во время разработки часто бывает удобнее всего просто выводить любые электронные письма на свой терминал с помощью консольного почтового сервера. Откройте settings.py
и добавьте в файл эту строку кода:
settings.py
# ...
EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"
# ...
В рабочей среде вы, вероятно, захотите определить пользовательский сервер электронной почты. На данный момент, установив EMAIL_BACKEND
на "django.core.mail.backends.console.EmailBackend"
, вы сможете скопировать и вставить ссылку для сброса пароля из терминала.
Примечание: Если вы хотите изменить шаблон электронной почты "сброс", вы можете добавить свой собственный шаблон по адресу registration/password_reset_email.html
.
Попробуйте запросить сброс пароля еще раз. При этом взгляните на выходные данные в окне терминала, на котором запущен ваш сервер разработки Django. После нажатия кнопки Отправить ссылку для сброса, вы увидите содержимое электронного письма для сброса в выходных данных вашего терминала:
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
Subject: Password reset on 127.0.0.1:8000
From: webmaster@localhost
To: philipp@realpython.com
Date: Wed, 18 Dec 2024 10:08:34 -0000
Message-ID: <173287491425.58492.16858044530563413153@philipp>
You're receiving this email because you requested a password reset
for your user account at 127.0.0.1:8000.
Please go to the following page and choose a new password:
http://127.0.0.1:8000/accounts/reset/Nw/ch906a-de23fda8df503bf8567b6485a/
Your username, in case you've forgotten: Philipp
Thanks for using our site!
The 127.0.0.1:8000 team
Часть содержимого может выглядеть немного странно, поскольку вы находитесь на локальном сервере разработки. Важной частью этого вывода является ссылка для сброса пароля. Это ссылка, которую пользователь должен щелкнуть, чтобы запустить сброс пароля.
Сброс паролей
Прежде чем можно будет использовать ссылку, вам необходимо создать два других шаблона, которые будут отображаться в процессе сброса пароля:
registration/password_reset_confirm.html
registration/password_reset_complete.html
Начните с password_reset_confirm.html
, после чего отобразится форма для сброса пароля:
users/templates/registration/password_reset_confirm.html
{% extends "base.html" %}
{% block content %}
<h2>Confirm password reset</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Confirm" />
</form>
<a href="{% url 'dashboard' %}">Back to dashboard</a>
{% endblock content %}
После отправки этой формы Django перенаправит вас на страницу успешного завершения. Шаблоном для этой страницы является password_reset_complete.html
:
users/templates/registration/password_reset_complete.html
{% extends "base.html" %}
{% block content %}
<h2>Password reset completed</h2>
<a href="{% url 'login' %}">Login</a>
{% endblock content %}
Теперь, когда у вас есть все шаблоны, скопируйте ссылку для сброса пароля из электронного письма и вставьте ее в свой браузер. Ссылка должна иметь такой шаблон, как accounts/reset/<uidb64>/<token>/
. Страница, которую вы увидите после перехода по ссылке "Сброс страницы", содержит форму для сброса вашего пароля:
Как только вы введете новый пароль и нажмете Подтвердить, вы будете перенаправлены на страницу "password_reset_complete"
. После этого вы сможете войти в систему со своим новым паролем.
Повторно активируйте средство проверки пароля
В начале этого руководства вы отключили средства проверки паролей в настройках вашего проекта, чтобы сделать рабочий процесс разработки более удобным. Теперь, когда ваша система управления пользователями завершена, самое время снова активировать средства проверки паролей:
user_auth_intro/settings.py
# ...
AUTH_PASSWORD_VALIDATORS = [
{
"NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",
},
{
"NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
},
{
"NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",
},
{
"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",
},
]
# ...
Теперь Django будет применять надежные пароли для новых пользователей. Вы можете ознакомиться с правилами при посещении http://127.0.0.1:8000/accounts/password_change/
от имени зарегистрированного пользователя:
В дополнение к другим правилам, новые пароли теперь должны содержать не менее восьми символов и не могут быть полностью цифровыми. Теперь у вас есть не только работающая система управления пользователями, но и система, которая обеспечивает безопасность паролей для ваших пользователей.
Заключение
Поздравляем! Вы добавили систему управления пользователями в свое веб-приложение Django, используя встроенную систему аутентификации Django. Чтобы улучшить взаимодействие с пользователем, теперь вы можете расширить некоторые базовые функциональные возможности Django по своему вкусу.
В этом руководстве вы узнали, как:
- Использование аутентификации пользователя в Django реализация
- Сделайте разработку более удобной, настроив Средства проверки паролей в Django
- Создайте приложение, в котором пользователи смогут зарегистрироваться, войти в систему и выйти из системы
- Предоставить пользователям инструменты для самостоятельного сброса и смены паролей
- Отредактируйте шаблоны Django по умолчанию, отвечающие за управление пользователями
- Работа со ссылками для сброса пароля
Теперь все готово для приглашения пользователей в ваше веб-приложение. Если вы хотите еще глубже погрузиться в управление пользователями в Django, то можете ознакомиться с руководством по управлению пользователями на сайте администратора Django.
Часто задаваемые вопросы
Теперь, когда у вас есть некоторый опыт работы с управлением пользователями Django на Python, вы можете воспользоваться приведенными ниже вопросами и ответами, чтобы проверить свое понимание и резюмировать то, что вы узнали.
- Вы настраиваете аутентификацию пользователя в Django, используя встроенную систему аутентификации Django, которая включает URL-адреса и представления. Затем вам нужно создать шаблоны для входа в систему, выхода из системы и управления паролями.
- Аутентификация проверяет личность пользователя, как и вход в систему, в то время как авторизация определяет, какие действия пользователю разрешено выполнять после аутентификации.
- Нет. Начиная с версии Django 5, вы должны выйти из системы, отправив запрос POST в представление
"logout"
. - Вы создаете систему входа в систему, добавляя
path("accounts/", include("django.contrib.auth.urls"))
в списокurlpatterns
в вашем файлеurls.py
. Затем вы должны создать файлlogin.html
в папке шаблоновregistration/
. - Вы сбрасываете пароль, используя представления для сброса пароля в Django и настраивая шаблоны, отправляя ссылку для сброса на электронную почту пользователя и позволяя пользователю установить новый пароль по этой ссылке.