DRF 密码重置工作流程抛出 django.template.exceptions.TemplateDoesNotExist
DRF password rest workflow throwing django.template.exceptions.TemplateDoesNotExist
我将 Django Rest Password Reset 用于重设密码工作流程,因为在我看来,它是针对此特定案例的最佳支持。
在urls.py
# Password reset
path('reset-password/verify-token/', views.CustomPasswordTokenVerificationView.as_view(), name='password_reset_verify_token'),
path('reset-password/', include('django_rest_passwordreset.urls', namespace='password_reset')),
并在 settings.py
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
如果我在运行服务器之后进入重置密码/,这就是我得到的
如果我 POST 一封未存储在数据库中的电子邮件,那么它会给出一个带有
的 HTTP 400 错误请求
{
"email": [
"There is no active user associated with this e-mail address or the password can not be changed"
]
}
如果我 POST 一封存储在数据库中的电子邮件,那么我会得到
TemplateDoesNotExist at /test_app/reset-password/
user_reset_password.html
我将信号接收器放在名为 CustomPasswordResetView 的视图中
class CustomPasswordResetView:
@receiver(reset_password_token_created)
def password_reset_token_created(sender, reset_password_token, *args, **kwargs):
"""
Handles password reset tokens
When a token is created, an e-mail needs to be sent to the user
"""
# send an e-mail to the user
context = {
'current_user': reset_password_token.user,
'username': reset_password_token.user.username,
'email': reset_password_token.user.email,
'reset_password_url': "{}?token={}".format(reverse('password_reset:reset-password-request'), reset_password_token.key)
}
# render email text
email_html_message = render_to_string('user_reset_password.html', context)
email_plaintext_message = render_to_string('user_reset_password.txt', context)
msg = EmailMultiAlternatives(
# title:
"Password Reset for {title}".format(title="Some website title"),
# message:
email_plaintext_message,
# from:
"test@test.com",
# to:
[reset_password_token.user.email]
)
msg.attach_alternative(email_html_message, "text/html")
msg.send()
正如您在其中所读到的,有一个用于呈现电子邮件文本的地方
email_html_message = render_to_string('user_reset_password.html', context)
email_plaintext_message = render_to_string('user_reset_password.txt', context)
在视图所在的同一文件夹中,创建了两个文件 user_reset_password.html 和 user_reset_password.txt,其中内容相同
{% load i18n %}{% blocktrans %}Hello!
You're receiving this e-mail because you or someone else has requested a password for your user account.
It can be safely ignored if you did not request a password reset. Click the link below to get the token.{% endblocktrans %}
{{ reset_password_url }}
Then, if you go to /test_app/reset-password/confirm/, you can paste the token and the new password.
{% if email %}{% blocktrans %}In case you forgot, your email is {{ email }}.{% endblocktrans %}
{% endif %}{% blocktrans %}Have a great day!
{% endblocktrans %}
为什么我的 TemplateDoesNotExist at /test_app/reset-password/ user_reset_password.html 以及如何解决它?
根据模板documentation
Templates engines are configured with the TEMPLATES setting. It’s a
list of configurations, one for each engine. The default value is
empty.
您可以有根模板文件夹,您应该在其中添加模板
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
...
},
如果你想拥有每个应用程序模板文件夹,你可以查看以下内容docs
'APP_DIRS': True,
我将 Django Rest Password Reset 用于重设密码工作流程,因为在我看来,它是针对此特定案例的最佳支持。
在urls.py
# Password reset
path('reset-password/verify-token/', views.CustomPasswordTokenVerificationView.as_view(), name='password_reset_verify_token'),
path('reset-password/', include('django_rest_passwordreset.urls', namespace='password_reset')),
并在 settings.py
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
如果我在运行服务器之后进入重置密码/,这就是我得到的
如果我 POST 一封未存储在数据库中的电子邮件,那么它会给出一个带有
的 HTTP 400 错误请求{
"email": [
"There is no active user associated with this e-mail address or the password can not be changed"
]
}
如果我 POST 一封存储在数据库中的电子邮件,那么我会得到
TemplateDoesNotExist at /test_app/reset-password/ user_reset_password.html
我将信号接收器放在名为 CustomPasswordResetView 的视图中
class CustomPasswordResetView:
@receiver(reset_password_token_created)
def password_reset_token_created(sender, reset_password_token, *args, **kwargs):
"""
Handles password reset tokens
When a token is created, an e-mail needs to be sent to the user
"""
# send an e-mail to the user
context = {
'current_user': reset_password_token.user,
'username': reset_password_token.user.username,
'email': reset_password_token.user.email,
'reset_password_url': "{}?token={}".format(reverse('password_reset:reset-password-request'), reset_password_token.key)
}
# render email text
email_html_message = render_to_string('user_reset_password.html', context)
email_plaintext_message = render_to_string('user_reset_password.txt', context)
msg = EmailMultiAlternatives(
# title:
"Password Reset for {title}".format(title="Some website title"),
# message:
email_plaintext_message,
# from:
"test@test.com",
# to:
[reset_password_token.user.email]
)
msg.attach_alternative(email_html_message, "text/html")
msg.send()
正如您在其中所读到的,有一个用于呈现电子邮件文本的地方
email_html_message = render_to_string('user_reset_password.html', context)
email_plaintext_message = render_to_string('user_reset_password.txt', context)
在视图所在的同一文件夹中,创建了两个文件 user_reset_password.html 和 user_reset_password.txt,其中内容相同
{% load i18n %}{% blocktrans %}Hello!
You're receiving this e-mail because you or someone else has requested a password for your user account.
It can be safely ignored if you did not request a password reset. Click the link below to get the token.{% endblocktrans %}
{{ reset_password_url }}
Then, if you go to /test_app/reset-password/confirm/, you can paste the token and the new password.
{% if email %}{% blocktrans %}In case you forgot, your email is {{ email }}.{% endblocktrans %}
{% endif %}{% blocktrans %}Have a great day!
{% endblocktrans %}
为什么我的 TemplateDoesNotExist at /test_app/reset-password/ user_reset_password.html 以及如何解决它?
根据模板documentation
Templates engines are configured with the TEMPLATES setting. It’s a list of configurations, one for each engine. The default value is empty.
您可以有根模板文件夹,您应该在其中添加模板
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
...
},
如果你想拥有每个应用程序模板文件夹,你可以查看以下内容docs
'APP_DIRS': True,