Сброс пароля Django в Python — подробно на примерах

Функция сброса пароля Django позволяет пользователям сбрасывать свои пароли с помощью адресов электронной почты в Python.

Содержание

Знакомство со сбросом пароля в Django

На следующей схеме показан процесс, позволяющий пользователю сбросить пароль с помощью адреса электронной почты:

Схема процесса сброса пароля в Django

Сначала пользователь нажимает ссылку «Reset Password» в форме входа:

Пример сброса пароля в форме входа

Django отображает форму, позволяющую пользователю ввести адрес электронной почты для получения ссылки для сброса пароля:

Форма внесения адреса электронной почты для сброса пароля

Для визуализации этой формы Django использует представление PasswordResetView.

Во-вторых, пользователь вводит адрес электронной почты и нажимает кнопку «Send»:

Ввод адреса электронной почты

Django отправляет электронное письмо на указанный адрес электронной почты и отображает сообщение, предлагающее пользователю проверить почтовый ящик.

Сообщение, предлагающее пользователю проверить почтовый ящик

Для визуализации этой формы Django использует класс PasswordResetDoneView.

В-третьих, пользователь открывает почтовый ящик и нажимает на ссылку для сброса пароля:

Ссылка для сброса пароля

Наконец, пользователь вводит новый пароль и нажимает кнопку «Reset Password»:

Введение нового пароля и сброс старого

Django отображает подтверждающее сообщение:

Подтверждение сброса пароля

Для обработки этой страницы Django использует PasswordResetCompleteView.

Реализация сброса пароля для приложения Todo

Измените views.py приложения пользователя, чтобы сопоставить URL-адрес сброса пароля с соответствующими представлениями на основе классов:

from django.urls import path
from .views import MyLoginView, RegisterView

from django.contrib.auth.views import(
    LogoutView, 
    PasswordResetView, 
    PasswordResetDoneView, 
    PasswordResetConfirmView,
    PasswordResetCompleteView
)

urlpatterns = [
    path('login/', MyLoginView.as_view(redirect_authenticated_user=True),name='login'),
    path('logout/', LogoutView.as_view(next_page='login'),name='logout'),
    path('register/', RegisterView.as_view(),name='register'),
    path('password-reset/', PasswordResetView.as_view(template_name='users/password_reset.html'),name='password-reset'),
    path('password-reset/done/', PasswordResetDoneView.as_view(template_name='users/password_reset_done.html'),name='password_reset_done'),
    path('password-reset-confirm/<uidb64>/<token>/', PasswordResetConfirmView.as_view(template_name='users/password_reset_confirm.html'),name='password_reset_confirm'),
    path('password-reset-complete/',PasswordResetCompleteView.as_view(template_name='users/password_reset_complete.html'),name='password_reset_complete'),
]

PasswordResetView

Сначала сопоставьте URL сброса пароля ‘password-reset/’ с результатом метода as_view() класса PasswordResetView. Представление на основе класса PasswordResetView использует шаблон users/password_reset.html для визуализации формы.

Во-вторых, создайте шаблон password_reset.html в каталоге templates/users:

{%extends 'base.html'%}

{%block content%}
<div class="center">
	<form method="post" class="card">
		{% csrf_token %}
	    <h2 class="text-center">Reset Password</h2>
		{% for field in form %}
	    		{{ field.label_tag }} 
	        	{{ field }}
	        	{% if field.errors %}
	        		<small>{{ field.errors|striptags  }}</small> 
	        	{% endif %}
		{% endfor %}
		<div class="form-buttons">
			<input type="submit" value="Send" class="btn btn-primary">
			<a href="{%url 'login' %}"  class="btn btn-outline">Cancel</a>
		</div>
	</form>
	</div>
{%endblock content%}

PasswordResetDoneView

Сначала сопоставьте password-reset/done/ с результатом метода as_view() класса PasswordResetDoneView. Класс PasswordResetDoneView использует шаблон password_reset_done.html для рендеринга страницы:

path('password-reset/done/', PasswordResetDoneView.as_view(template_name='users/password_reset_done.html'),name='password_reset_done'),

Во-вторых, создайте шаблон reset_password_done.html в каталоге templates/users:

{%extends 'base.html'%}

{%block content%}

<div class="center card">
	<h2>Reset Password</h2>
	<p>Please check your inbox and follow the instruction to reset your password.</p>
</div>

{%endblock content%}

PasswordResetConfirmView

Сначала сопоставьте URL-адрес password-reset-confirm/// с результатом as_view() класса PasswordResetConfirmView:

path('password-reset-confirm/<uidb64>/<token>/', PasswordResetConfirmView.as_view(template_name='users/password_reset_confirm.html'),name='password_reset_confirm'),

Класс PasswordResetConfirmView использует шаблон password_reset_confirm.html для рендеринга страницы. URL сброса пароля выглядит следующим образом:

http://127.0.0.1:8000/password-reset-confirm/OA/bfwk0g-d87966e0a694f519bc6f29daa4616b07/

Во-вторых, создайте шаблон password_reset_confirm.html в каталоге templates/users:

{%extends 'base.html'%}

{%block content%}

<div class="center">
	<form method="post" class="card">
	  {% csrf_token %}
	  <h2>Password Reset Confirm</h2>
	  
	  {% for field in form %}
	    		{{ field.label_tag }} 
	        	{{ field }}
	        	{% if field.errors %}
	        		<small>{{ field.errors|striptags  }}</small> 
	        	{% endif %}
		{% endfor %}
	  
	  
	  <div>
	    <button type="submit" class="btn btn-primary">Reset Password</button>
	  </div>
	</form>
</div>


{%endblock content%}

PasswordResetCompleteView

Сначала сопоставьте полный URL сброса пароля с методом as_view() класса PasswordResetCompleteView.

{%extends 'base.html'%}

{%block content%}

<div class="card center">
	<p>Your password has been changed successfully. Please <a href="{% url 'login' %}">Login</a></p>
</div>
 	
{%endblock content%}

Во-вторых, создайте шаблон password_reset_complete.html в каталоге templates/users.

{%extends 'base.html'%}

{%block content%}
  <div class="center">
	  <form method="post" class="card" novalidate>
	  	{% csrf_token %}
	    <h2 class="text-center">Log in to your account</h2>
		{% for field in form %}
	    		{{ field.label_tag }} 
	        	{{ field }}
	        	{% if field.errors %}
	        		<small>{{ field.errors|striptags  }}</small> 
	        	{% endif %}
		{% endfor %}
		
		<input type="submit" value="Login" class="btn btn-primary full-width">
		<hr>
		<p class="text-center">Forgot your password <a href="{%url 'password-reset'%}">Reset Password</a></p>
		<p class="text-center">Don't have a account? <a href="{%url 'register'%}">Join Now</a></p>
	</form>
</div>

{%endblock content%}

Настройка SMTP для отправки писем из приложения Django

Для отправки электронных писем в Django вам понадобится локальный сервер Simple Mail Transfer Protocol(SMTP) или внешний SMTP-сервер от поставщика услуг электронной почты.

После создания SMTP-сервера вы можете добавить его информацию в settings.py проекта Django, указав следующую информацию:

  • EMAIL_HOST: хост SMTP-сервера.
  • EMAIL_PORT: порт SMTP, по умолчанию 25.
  • EMAIL_HOST_USER: Имя пользователя для SMTP-сервера.
  • EMAIL_HOST_PASSWORD: пароль для SMTP-сервера.
  • EMAIL_USE_TLS: использовать ли защищенное соединение Transport Layer Security(TLS).

Например, ниже показано, как использовать настройки SMTP-сервера Google:

EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_PORT = 25
EMAIL_USE_TLS = True
EMAIL_HOST_USER = '[email protected]'
EMAIL_HOST_PASSWORD = 'your_gmail_password'

Обратите внимание, что вам следует заменить EMAIL_HOST_USER и EMAIL_HOST_PASSWORD на данные вашего аккаунта Gmail.

Если у вас нет локального SMTP-сервера, вы можете использовать следующее значение в файле settings.py:

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

Используя эту настройку, Django будет выводить все письма в консоль(Shell) вместо их отправки. Это очень удобно для тестирования без SMTP-сервера:

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

Пример вывода будет выглядеть так:

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: [email protected]
Date: <date>
Message-ID:
 <[email protected]>


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/password-reset-confirm/OA/bfwytu-b9f9b789e9a294eb80d707e448dde1d2/

Your username, in case you’ve forgotten: jane

Thanks for using our site!

The 127.0.0.1:8000 team

Если вы хотите настроить электронное письмо для сброса пароля, вы можете создать файл password_reset_email.html в каталоге templates/users:

<p>Hi</p>

<p>You're receiving this email because you requested a password reset for your user account at {{domain}}/</p>

<p>Please click the following link to reset your password:</p>

{{ protocol }}://{{ domain }}{% url "password_reset_confirm" uidb64=uid token=token %}

<p>Thanks</p>
<p>Todo App Team</p>

И укажите html_email_template_name в методе as_view() класса PasswordResetView:

path('password-reset/', 
     PasswordResetView.as_view(
        template_name='users/password_reset.html',
        html_email_template_name='users/password_reset_email.html'
    ),
    name='password-reset'
)

Если вы сбросите пароль, Django вместо этого будет использовать пользовательский шаблон электронной почты:

<p>Hi</p>

<p>You're receiving this email because you requested a password reset for your user account at 127.0.0.1:8000/</p>

<p>Please click the following link to reset your password:</p>

http://127.0.0.1:8000/password-reset-confirm/OA/bfwzqv-9d6b6777ad40073cfa1d4d4e150fb76f/

<p>Thanks</p>
<p>Todo App Team</p>
Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *