我正在尝试创建一个用于通过电子邮件重置被遗忘的密码的系统,但正在遇到一些错误。
我的URL是:
from django.contrib.auth import views as auth_views
urlpatterns = [
url(r'^$', auth_views.login, name='login'),
url(r'^logout/$', auth_views.logout, name='logout'),
## more irrelevant urls here ##
url(r'^password/reset/done/$', auth_views.PasswordResetDoneView.as_view(), name='password_reset_done'),
url(r'^password/reset/$', auth_views.PasswordResetView.as_view(), name='password_reset'),
url(r'^password/reset/(?P<uidb64>[0-9A-Za-z_-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$', auth_views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
url(r'^password/reset/complete/$', auth_views.PasswordResetCompleteView.as_view(), name='password_reset_complete'),
]
当电子邮件地址在password_reset
提交时,电子邮件发送了,但我会收到此错误:
Internal Server Error: /password/reset/
Traceback (most recent call last):
File "C:pythonlibsite-packagesdjangocorehandlersexception.py", line 41, in inner
response = get_response(request)
File "C:pythonlibsite-packagesdjangocorehandlersbase.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:pythonlibsite-packagesdjangocorehandlersbase.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:pythonlibsite-packagesdjangoviewsgenericbase.py", line 68, in view
return self.dispatch(request, *args, **kwargs)
File "C:pythonlibsite-packagesdjangoutilsdecorators.py", line 67, in _wrapper
return bound_func(*args, **kwargs)
File "C:pythonlibsite-packagesdjangoutilsdecorators.py", line 149, in _wrapped_view
response = view_func(request, *args, **kwargs)
File "C:pythonlibsite-packagesdjangoutilsdecorators.py", line 63, in bound_func
return func.__get__(self, type(self))(*args2, **kwargs2)
File "C:pythonlibsite-packagesdjangocontribauthviews.py", line 439, in dispatch
return super(PasswordResetView, self).dispatch(*args, **kwargs)
File "C:pythonlibsite-packagesdjangoviewsgenericbase.py", line 88, in dispatch
return handler(request, *args, **kwargs)
File "C:pythonlibsite-packagesdjangoviewsgenericedit.py", line 183, in post
return self.form_valid(form)
File "C:pythonlibsite-packagesdjangocontribauthviews.py", line 453, in form_valid
return super(PasswordResetView, self).form_valid(form)
File "C:pythonlibsite-packagesdjangoviewsgenericedit.py", line 79, in form_valid
return HttpResponseRedirect(self.get_success_url())
File "C:pythonlibsite-packagesdjangoviewsgenericedit.py", line 67, in get_success_url
if self.success_url:
File "C:pythonlibsite-packagesdjangoutilsfunctional.py", line 114, in __wrapper__
res = func(*self.__args, **self.__kw)
File "C:pythonlibsite-packagesdjangourlsbase.py", line 91, in reverse
return force_text(iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs)))
File "C:pythonlibsite-packagesdjangourlsresolvers.py", line 497, in _reverse_with_prefix
raise NoReverseMatch(msg)
django.urls.exceptions.NoReverseMatch: Reverse for 'password_reset_done' not found. 'password_reset_done' is not a valid view function or pattern name.
[11/Feb/2018 14:32:04] "POST /password/reset/ HTTP/1.1" 500 121086
当我将链接复制到浏览器中并重置密码时,密码正确重置,但出现以下错误:
Internal Server Error: /password/reset/MQ/set-password/
Traceback (most recent call last):
File "C:pythonlibsite-packagesdjangocorehandlersexception.py", line 41, in inner
response = get_response(request)
File "C:pythonlibsite-packagesdjangocorehandlersbase.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:pythonlibsite-packagesdjangocorehandlersbase.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:pythonlibsite-packagesdjangoviewsgenericbase.py", line 68, in view
return self.dispatch(request, *args, **kwargs)
File "C:pythonlibsite-packagesdjangoutilsdecorators.py", line 67, in _wrapper
return bound_func(*args, **kwargs)
File "C:pythonlibsite-packagesdjangoviewsdecoratorsdebug.py", line 76, in sensitive_post_parameters_wrapper
return view(request, *args, **kwargs)
File "C:pythonlibsite-packagesdjangoutilsdecorators.py", line 63, in bound_func
return func.__get__(self, type(self))(*args2, **kwargs2)
File "C:pythonlibsite-packagesdjangoutilsdecorators.py", line 67, in _wrapper
return bound_func(*args, **kwargs)
File "C:pythonlibsite-packagesdjangoviewsdecoratorscache.py", line 57, in _wrapped_view_func
response = view_func(request, *args, **kwargs)
File "C:pythonlibsite-packagesdjangoutilsdecorators.py", line 63, in bound_func
return func.__get__(self, type(self))(*args2, **kwargs2)
File "C:pythonlibsite-packagesdjangocontribauthviews.py", line 489, in dispatch
return super(PasswordResetConfirmView, self).dispatch(*args, **kwargs)
File "C:pythonlibsite-packagesdjangoviewsgenericbase.py", line 88, in dispatch
return handler(request, *args, **kwargs)
File "C:pythonlibsite-packagesdjangoviewsgenericedit.py", line 183, in post
return self.form_valid(form)
File "C:pythonlibsite-packagesdjangocontribauthviews.py", line 522, in form_valid
return super(PasswordResetConfirmView, self).form_valid(form)
File "C:pythonlibsite-packagesdjangoviewsgenericedit.py", line 79, in form_valid
return HttpResponseRedirect(self.get_success_url())
File "C:pythonlibsite-packagesdjangoviewsgenericedit.py", line 67, in get_success_url
if self.success_url:
File "C:pythonlibsite-packagesdjangoutilsfunctional.py", line 114, in __wrapper__
res = func(*self.__args, **self.__kw)
File "C:pythonlibsite-packagesdjangourlsbase.py", line 91, in reverse
return force_text(iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs)))
File "C:pythonlibsite-packagesdjangourlsresolvers.py", line 497, in _reverse_with_prefix
raise NoReverseMatch(msg)
django.urls.exceptions.NoReverseMatch: Reverse for 'password_reset_complete' not found. 'password_reset_complete' is not a valid view function or pattern name.
[11/Feb/2018 14:37:16] "POST /password/reset/MQ/set-password/ HTTP/1.1" 500 134868
从技术上讲,系统的功能,但显然这些错误消息不是理想的。
这些是我问的其他问题:
noreversematch错误与密码重置电子邮件
通过电子邮件密码重置系统错误
这是我遵循的教程。
我不知道在较新的djangos中是否仍然可以使用,但是在以前的版本中,我们已经完成了此操作:
# django login views
urlpatterns += patterns(
'django.contrib.auth.views',
url(r'^logout/$',
'logout',
dict(
template_name='my/logout.html',
redirect_field_name='next',
)),
url(r'^password-reset/$',
'password_reset',
dict(
template_name='my/password-reset-form.html',
email_template_name='my/password-reset-email.html',
subject_template_name='my/password-reset-email-subject.html',
from_email=settings.FROM_EPOST,
),
name="my-password-reset"),
url(r'^password-reset-done/$',
'password_reset_done',
dict(
template_name='my/password-reset-done.html',
)),
url(r'^password-reset-confirm/(?P<uidb64>.+)/(?P<token>.+)/$',
'password_reset_confirm',
dict(
template_name='my/password-reset-confirm.html',
# post_reset_redirect='url',
)),
url(r'^password-reset-complete/$',
'password_reset_complete',
dict(
template_name='my/password-reset-complete.html',
)),
)
我似乎记得在这些URL中遭到斜线有一个问题,但是自写这些URL以来已经很长时间了。
电子邮件模板包含:
{% block reset_link %}
{{ protocol }}://{{ domain }}{% url 'django.contrib.auth.views.password_reset_confirm' uidb64=uid token=token %}
{% endblock %}
您没有重新匹配,因为password_reset函数正在重定向到('password_reset_done'(,而不是您的应用程序名称空间有关完整的详细信息,您可以在此处检查文档
例如,如果您的选举应用程序包含URL看起来像:
urlpatterns = [
url(r'election', include(election.urls, namespace="SomeName")),
]
您可以通过删除包含URL中的名称/名称空间来解决问题,或者需要覆盖password_reset函数。 来自django.contrib.auth.view import incument password_reset
#views.py
def new_password_reset(password_reset):
if post_reset_redirect is None:
post_reset_redirect = reverse('SomeName:password_reset_done')
return TemplateResponse(request, template_name, context)
#urls.py
from election import views as election_views
#and in your urls change that url:
url(r'^password_reset/$', auth_views.password_reset, name='password_reset')
#with that url :
url(r'^password_reset/$', election_views.new_password_reset, name='password_reset')
你应该好起来的