【问题标题】:django 1.6 password reset issuesdjango 1.6 密码重置问题
【发布时间】:2016-09-05 17:17:25
【问题描述】:

我在 django 1.6 网站上重置密码时遇到问题。 urls.py 有:

url(r'^reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>.+)/$',
   'django.contrib.auth.views.password_reset_confirm',
   name='password_reset_confirm'

当我点击Reset my password 链接时,我得到:

NoReverseMatch at /user/password/reset/
Reverse for 'django.contrib.auth.views.password_reset_confirm' with arguments '()' and keyword arguments '{u'uidb36': 'Mw', u'token': u'4bs-b5728359cb279d542120'}' not found. 1 pattern(s) tried: ['reset/(?P<uidb64>[0-9A-Za-z_\\-]+)/(?P<token>.+)/$']

这是回溯:

Traceback:
File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  112.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapped_view
  99.                     response = view_func(request, *args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/django/contrib/auth/views.py" in password_reset
  158.             form.save(**opts)
File "/usr/local/lib/python2.7/site-packages/django/contrib/auth/forms.py" in save
  256.             email = loader.render_to_string(email_template_name, c)
File "/usr/local/lib/python2.7/site-packages/django/template/loader.py" in render_to_string
  164.         return t.render(Context(dictionary))
File "/usr/local/lib/python2.7/site-packages/django/template/base.py" in render
  140.             return self._render(context)
File "/usr/local/lib/python2.7/site-packages/django/template/base.py" in _render
  134.         return self.nodelist.render(context)
File "/usr/local/lib/python2.7/site-packages/django/template/base.py" in render
  840.                 bit = self.render_node(node, context)
File "/usr/local/lib/python2.7/site-packages/django/template/base.py" in render_node
  854.         return node.render(context)
File "/usr/local/lib/python2.7/site-packages/django/template/defaulttags.py" in render
  447.                         six.reraise(*exc_info)
File "/usr/local/lib/python2.7/site-packages/django/template/defaulttags.py" in render
  433.             url = reverse(view_name, args=args, kwargs=kwargs, current_app=context.current_app)
File "/usr/local/lib/python2.7/site-packages/django/core/urlresolvers.py" in reverse
  536.     return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))
File "/usr/local/lib/python2.7/site-packages/django/core/urlresolvers.py" in _reverse_with_prefix
  456.                              (lookup_view_s, args, kwargs, len(patterns), patterns))

Exception Type: NoReverseMatch at /user/password/reset/
Exception Value: Reverse for 'django.contrib.auth.views.password_reset_confirm' with arguments '()' and keyword arguments '{u'uidb36': 'Mw', u'token': u'4bs-b5728359cb279d542120'}' not found. 1 pattern(s) tried: ['reset/(?P<uidb64>[0-9A-Za-z_\\-]+)/(?P<token>.+)/$']

【问题讨论】:

标签: django


【解决方案1】:

您的第一个问题:(您现在已在问题中解决)

您需要更新正则表达式以包含_\-,并将名称uidb36 更改为uidb64。应该是:

url(r'^reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>.+)/$',
    'django.contrib.auth.views.password_reset_confirm',
    name='password_reset_confirm'
),

你的第二个问题:

您需要更新您的registration/password_reset_email.html 电子邮件模板以使用uidb64 而不是uidb36。示例电子邮件模板given in the docs 是:

Someone asked for password reset for email {{ email }}. Follow the link below:
{{ protocol}}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}

Django 1.6 release notes 中涵盖了所有内容。

【讨论】:

  • 是的,我将其命名为 uidb64。问题正如我在原始帖子中所说的那样,Reverse for 'django.contrib.auth.views.password_reset_confirm' with arguments '()' and keyword arguments '{u'uidb36': 'Mw', u'token': u'4bs-bd0dd5db5e44f6a33c5e'}' not found. 1 pattern(s) tried: ['password_reset_confirm/(?P&lt;uidb64&gt;[0-9A-Za-z]+)-(?P&lt;token&gt;.+)/$'] 失败了
  • 您没有仔细阅读我的答案或发行说明。你有(?P&lt;uidb64&gt;[0-9A-Za-z])。应该是(?P&lt;uidb64&gt;[0-9A-Za-z_\-])
  • 我做了那个改变。我现在有url(r'^reset/(?P&lt;uidb64&gt;[0-9A-Za-z_\-]+)/(?P&lt;token&gt;.+)/$', 'django.contrib.auth.views.password_reset_confirm', name='password_reset_confirm' 但我得到的错误有uidb36 这是我现在得到的错误:NoReverseMatch at /user/password/reset/ Reverse for 'django.contrib.auth.views.password_reset_confirm' with arguments '()' and keyword arguments '{u'uidb36': 'Mw', u'token': u'4bs-b5728359cb279d542120'}' not found. 1 pattern(s) tried: ['reset/(?P&lt;uidb64&gt;[0-9A-Za-z_\\-]+)/(?P&lt;token&gt;.+)/$']
  • 尝试生成一个新的密码重置链接,看看是否可行。如果这不起作用,请使用完整的回溯更新您的问题。
  • 谢谢。一旦我修复了registration/password_reset_email.html,它就可以工作了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
  • 2011-11-22
  • 1970-01-01
  • 2011-04-01
相关资源
最近更新 更多