Redefinição de senha do Django

Resumo : neste tutorial, você aprenderá como implementar o recurso Django Password Reset que permite aos usuários redefinir suas senhas usando endereços de e-mail.

Este tutorial começa onde o  tutorial do Django FormView  parou.

Introdução à redefinição de senha no Django

O diagrama a seguir ilustra o fluxo que permite a um usuário redefinir a senha usando um endereço de e-mail:

Primeiro, o usuário clica no link Redefinir senha no formulário de login:

Django exibe um formulário que permite ao usuário inserir um endereço de e-mail para receber o link de redefinição de senha:

Django usa a PasswordResetViewview para renderizar este formulário.

Segundo, o usuário insere um endereço de e-mail e clica no botão Enviar:

Django envia um email para o endereço de email inserido e exibe uma mensagem que instrui o usuário a verificar a caixa de entrada.

Django usa a PasswordResetDoneViewclasse para renderizar este formulário.

Terceiro, o usuário abre a caixa de entrada e clica no link de redefinição de senha:

Por fim, o usuário insere a nova senha e clica no botão Redefinir senha:

Django exibe uma mensagem de confirmação:

Django usa o PasswordResetCompleteViewpara lidar com esta página.

Implementando redefinição de senha para o aplicativo Todo

Modifique o views.pyaplicativo userspara mapear o URL de redefinição de senha com as visualizações baseadas em classe correspondentes:

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'),
]Linguagem de código:  Python  ( python )

PasswordResetView

Primeiro, mapeie a URL de redefinição de senha 'password-reset/'com o resultado do as_view()método da PasswordResetViewclasse. A PasswordResetViewvisualização baseada em classe usa o users/password_reset.htmlmodelo para renderizar o formulário.

Segundo, crie o password_reset.htmlmodelo no templates/usersdiretório:

{%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%}Linguagem de código:  Python  ( python )

PasswordResetDoneView

Primeiro, mapeie o password-reset/done/resultado do as_view()método da PasswordResetDoneViewclasse. A PasswordResetDoneViewclasse usa o password_reset_done.htmlmodelo para renderizar a página:

path('password-reset/done/', PasswordResetDoneView.as_view(template_name='users/password_reset_done.html'),name='password_reset_done'),Linguagem de código:  Python  ( python )

Segundo, crie o reset_password_done.htmlmodelo no templates/usersdiretório:

{%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%}Linguagem de código:  Python  ( python )

PasswordResetConfirmView

Primeiro, mapeie a password-reset-confirm/<uidb64>/<token>/URL com o resultado da as_view()classe PasswordResetConfirmView:

path('password-reset-confirm/<uidb64>/<token>/', PasswordResetConfirmView.as_view(template_name='users/password_reset_confirm.html'),name='password_reset_confirm'),Linguagem de código:  Python  ( python )

A PasswordResetConfirmViewclasse usa o password_reset_confirm.htmlmodelo para renderizar a página. Um URL de redefinição de senha é semelhante a este:

http://127.0.0.1:8000/password-reset-confirm/OA/bfwk0g-d87966e0a694f519bc6f29daa4616b07/Linguagem de código:  Python  ( python )

Segundo, crie o password_reset_confirm.htmlmodelo no templates/usersdiretório:

{%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%}Linguagem de código:  Python  ( python )

PasswordResetCompleteView

Primeiro, mapeie o URL completo de redefinição de senha com o as_view()método da PasswordResetCompleteViewclasse.

{%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%}Linguagem de código:  Python  ( python )

Segundo, crie o password_reset_complete.htmlmodelo no templates/usersdiretório

{%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%}Linguagem de código:  Python  ( python )

Configurando SMTP para envio de e-mails do aplicativo Django

Para enviar e-mails no Django, você precisa ter um SMTPservidor local Simple Mail Transfer Protocol () ou um servidor externo SMTPde um provedor de serviços de e-mail.

Depois de ter um SMTPservidor, você pode adicionar suas informações ao settings.pyprojeto Django com as seguintes informações:

  • EMAIL_HOST: o SMTPhost do servidor.
  • EMAIL_PORT: a SMTPporta, o padrão é 25.
  • EMAIL_HOST_USER: o nome de usuário do SMTPservidor.
  • EMAIL_HOST_PASSWORD: a senha do SMTPservidor.
  • EMAIL_USE_TLS: se deve usar a TLSconexão segura Transport Layer Security ( ).

Por exemplo, o seguinte mostra como usar SMTPas configurações do servidor 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'Linguagem de código:  Python  ( python )

Observe que você deve substituir EMAIL_HOST_USERe EMAIL_HOST_PASSWORDpelas informações do Gmail.

Se você não tiver um SMTPservidor local, poderá usar o seguinte valor no settings.pyarquivo:

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'Linguagem de código:  Python  ( python )

Ao usar esta configuração, o Django enviará todos os emails para o console (Shell) em vez de enviá-los. Isto é muito conveniente para testes sem SMTPservidor:

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'Linguagem de código:  Python  ( python )

Um exemplo de saída será parecido com este:

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 teamLinguagem de código:  texto simples  ( texto simples )

Se quiser personalizar o e-mail de redefinição de senha, você pode criar um password_reset_email.htmlno templates/usersdiretório:

<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>
Linguagem de código:  HTML, XML  ( xml )

E especifique html_email_template_nameno as_view()método da PasswordResetViewclasse:

path('password-reset/', 
     PasswordResetView.as_view(
        template_name='users/password_reset.html',
        html_email_template_name='users/password_reset_email.html'
    ),
    name='password-reset'
)Linguagem de código:  Python  ( python )

Se você redefinir a senha, o Django usará o modelo de email personalizado:

<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>Linguagem de código:  Python  ( python )

Você pode baixar o código-fonte de redefinição de senha do Django aqui.

Resumo

  • Use as classes PasswordResetView, PasswordResetDoneView, PasswordResetConfirmViewe PasswordResetCompleteViewpara implementar a função de redefinição de senha para o aplicativo Django.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *