每次尝试重置密码时,Django会发送两封密码重置电子邮件。

4
我正在学习Django,并且一直在跟随在线教程构建一个Web应用程序。最近几天,我一直在尝试为应用程序添加密码重置功能。我已经设置了Google应用程序密码,并最终成功了密码重置。但是现在,每次尝试重置密码时,我都会收到两封密码重置电子邮件。我已经成功地重置了密码几次,但每次尝试重置密码时仍然会收到两封电子邮件。我试图在网上寻找答案,但没有找到任何东西。我还与教程中的代码进行了交叉检查。以下是一些可能相关的代码片段:
项目 settings.py:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = os.environ.get('EMAIL_USER')
EMAIL_HOST_PASSWORD = os.environ.get('EMAIL_PASS')

项目 urls.py 文件:

from django.contrib import admin
from django.urls import path, include
from users import views as user_views
from django.contrib.auth import views as auth_views
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
        path('admin/', admin.site.urls),
        path('register/', user_views.register, name='register'),
        path('login/', auth_views.LoginView.as_view(template_name='users/login.html'), name='login'),
        path('logout/', auth_views.LogoutView.as_view(template_name='users/logout.html'), name='logout'),
        path('password-reset/', auth_views.PasswordResetView.as_view(template_name='users/password_reset.html'),
             name='password_reset'),
        path('password-reset/done/', auth_views.PasswordResetDoneView.as_view(
            template_name='users/password_reset_done.html'), name='password_reset_done'),
        path('password-reset-confirm/<uidb64>/<token>/', auth_views.PasswordResetConfirmView.as_view(
            template_name='users/password_reset_confirm.html'), name='password_reset_confirm'),
        path('password-reset-complete/', auth_views.PasswordResetCompleteView.as_view(
            template_name='users/password_reset_complete.html'), name='password_reset_complete'),
        path('profile/', user_views.profile, name='profile'),
        path('', include('blog.urls')),
    ]

任何帮助都将不胜感激。谢谢!
附注:这是我在StackOverflow上的第一个问题。如果有改进的地方,请告诉我。

你从哪里导入了 auth_views - JPG
1
@ArakkalAbu,我已经编辑了问题以显示所有导入。 - Sultan Singh Atwal
1
很好。由于您正在使用内置视图,我认为问题不属于代码库。尝试使用其他电子邮件提供商,例如[Send Grid](https://sendgrid.com/),[Mail Gun](https://www.mailgun.com/)等。 - JPG
@SultanSinghAtwal,请确保只有一个密码重置请求的URL。 - Nalin Dobhal
可能是由于您的模板代码引起的,例如表单可能已经发送了两次。 - mh-firouzjah
2个回答

8

我曾有同样的问题,但答案很简单:

我敢打赌你有2个Django账户使用了相同的邮件地址。在我的情况下,我有一个普通用户账户,但我也是Django的管理员,并且也使用相同的邮件地址作为管理员账户。 :)

Django遍历所有账户,并向每个与邮件地址匹配的用户发送邮件。


我遇到了同样的问题,但是当我通过那个电子邮件地址搜索用户时,只有一个用户,不知道出了什么问题 :( - Doradus

0
我重写了PasswordResetView类。
正确。
class UserPasswordResetView(PasswordResetView):
    """."""

    def form_valid(self, form):
        r429 = ratelimit.consume_or_429(
            self.request,
            action="reset_password_email",
            key=form.cleaned_data["email"].lower(),
        )
        if r429:
            return r429
        form.save(self.request)
        signals.password_reset.send(
            sender=self.__class__,
            request=self.request,
            email=form.cleaned_data["email"].lower(),
        )
        return super(PasswordResetView, self).form_valid(form)

第一次我使用了return: return super().form_valid(form),是什么导致了消息被发送两次?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接