【发布时间】:2015-10-21 21:09:40
【问题描述】:
我正在尝试实现密码重置功能。
我的网址包含:
url(r'^password_reset/$','django.contrib.auth.views.password_reset', {'template_name': 'resetpassword.html', 'post_reset_redirect' : '/password_reset/mailed/'},
name="password_reset"),
url(r'^password_reset/mailed/$',
'django.contrib.auth.views.password_reset_done',{'template_name': 'resetpassword_mailed.html'}),
url(r'^password_reset/(?P<uidb36>[0-9A-Za-z]{1,13})-(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$',
'django.contrib.auth.views.password_reset_confirm',
{'post_reset_redirect' : '/password_reset/complete/'}),
url(r'^password_reset/complete/$',
'django.contrib.auth.views.password_reset_complete',{'template_name': 'resetpassword_complete.html'}),
和 settings.py:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.mail.ru'
EMAIL_HOST_USER = 'noreply@mysite.com'
DEFAULT_FROM_EMAIL = 'noreply@mysite.com'
EMAIL_HOST_PASSWORD = 'password'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
URL 路由工作正常,但是没有发送电子邮件。
如果我尝试使用 Django shell 并测试发送:
email = EmailMessage('Subject', 'Body', to=['test@email.com'])
email.send()
而且效果也很好。
我该如何解决这个问题?我没有收到任何错误消息,也不知道如何调试。
UPD 我发现在 django/contrib/auth/views.py: password_reset 方法中我总是去
else:
post_reset_redirect = resolve_url(post_reset_redirect)
部分并且从不实际发送电子邮件。怎么样?
if post_reset_redirect is None:
post_reset_redirect = reverse('password_reset_done')
else:
post_reset_redirect = resolve_url(post_reset_redirect)
if request.method == "POST":
form = password_reset_form(request.POST)
if form.is_valid():
print 'reset form valid'
opts = {
'use_https': request.is_secure(),
'token_generator': token_generator,
'from_email': from_email,
'email_template_name': email_template_name,
'subject_template_name': subject_template_name,
'request': request,
'html_email_template_name': html_email_template_name,
}
if is_admin_site:
opts = dict(opts, domain_override=request.get_host())
form.save(**opts)
return HttpResponseRedirect(post_reset_redirect)
【问题讨论】:
-
你在用
manage.py runserver吗? -
@Anentropic 是的,为什么?
-
尝试
email.send(fail_silently=False)并在此处发布错误。 -
@Leistungsabfall email.send 没有错误(fail_silently=False)。从 shell 发送电子邮件工作正常
-
在 django/contrib/auth/forms.PasswordResetForm send_mail 方法设置断点并检查那里是否一切顺利。