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 PasswordResetView
view 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 PasswordResetDoneView
classe 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 PasswordResetCompleteView
para lidar com esta página.
Implementando redefinição de senha para o aplicativo Todo
Modifique o views.py
aplicativo users
para 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
classe. A PasswordResetView
visualização baseada em classe usa o PasswordResetView
users/password_reset.html
modelo para renderizar o formulário.
Segundo, crie o password_reset.html
modelo no templates/users
diretó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
classe. A PasswordResetDoneView
classe usa o PasswordResetDoneView
password_reset_done.html
modelo 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.html
modelo no templates/users
diretó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 PasswordResetConfirmView
classe usa o password_reset_confirm.html
modelo 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.html
modelo no templates/users
diretó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 PasswordResetCompleteView
classe.
{%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.html
modelo no templates/users
diretó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
servidor local Simple Mail Transfer Protocol () ou um servidor externo SMTP
de um provedor de serviços de e-mail.SMTP
Depois de ter um SMTP
servidor, você pode adicionar suas informações ao settings.py
projeto Django com as seguintes informações:
EMAIL_HOST
: oSMTP
host do servidor.EMAIL_PORT
: aSMTP
porta, o padrão é 25.EMAIL_HOST_USER
: o nome de usuário doSMTP
servidor.EMAIL_HOST_PASSWORD
: a senha doSMTP
servidor.EMAIL_USE_
: se deve usar aTLS
TLS
conexão segura Transport Layer Security ( ).
Por exemplo, o seguinte mostra como usar SMTP
as 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_USER
e EMAIL_HOST_PASSWORD
pelas informações do Gmail.
Se você não tiver um SMTP
servidor local, poderá usar o seguinte valor no settings.py
arquivo:
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 SMTP
servidor:
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 team
Linguagem 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.html
no templates/users
diretó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_name
no as_view()
método da PasswordResetView
classe:
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
,PasswordResetConfirmView
ePasswordResetCompleteView
para implementar a função de redefinição de senha para o aplicativo Django.