21

我将Django-nonrel注册应用程序一起使用。一切似乎都很好,除非我尝试重设密码。单击电子邮件中发送给我的重置密码链接时,Django 会产生错误消息:

password_reset_confirm() got an unexpected keyword argument 'uidb36'

我的问题:有没有人看过它并且知道有什么治疗方法?

编辑:

问题是由registration\auth_urls.py 引起的——它们在django\contrib\auth\urls.py 中重复了条目,绕过了Django-nonrel 中文件的补丁版本。

任何想法为什么它在那里,我可以实际删除它或以其他方式修复它吗?

4

4 回答 4

34

Django 1.6 对用户 ID 使用 base 64 编码而不是 base 36 编码。

如果您有任何自定义密码重置 URL,则需要通过将 uidb36 替换为 uidb64 并将该模式​​后面的破折号替换为斜杠来更新它们。还将“_”、“\”和“-”添加到可能与 uidb64 模式匹配的字符列表中。

例如 Django 1.5- 中 urls.py 中的这一行:

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

在 Django 1.6+ 中需要更改为:

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

这是详细说明更改的官方更改日志: https ://docs.djangoproject.com/en/1.6/releases/1.6/#django-contrib-auth-password-reset-uses-base-64-encoding-of-user -pk

于 2013-12-03T21:51:56.873 回答
9

我的解决方案是注释掉registration\auth_urls.py 中定义的urlpatterns,并将它们重新定义为django.contrib.auth 中定义的urlpatterns 的副本。

这是更改后的我的 auth_urls.py:

"""
URL patterns for the views included in ``django.contrib.auth``.

Including these URLs (via the ``include()`` directive) will set up the
following patterns based at whatever URL prefix they are included
under:

* User login at ``login/``.

* User logout at ``logout/``.

* The two-step password change at ``password/change/`` and
  ``password/change/done/``.

* The four-step password reset at ``password/reset/``,
  ``password/reset/confirm/``, ``password/reset/complete/`` and
  ``password/reset/done/``.

The default registration backend already has an ``include()`` for
these URLs, so under the default setup it is not necessary to manually
include these views. Other backends may or may not include them;
consult a specific backend's documentation for details.

"""

from django.conf.urls.defaults import *

#from django.contrib.auth import views as auth_views

from django.contrib.auth import urls as auth_urls

urlpatterns = auth_urls.urlpatterns

'''
Commented out, this is what caused my problems:

urlpatterns = patterns('',
                       url(r'^login/$',
                           auth_views.login,
                           {'template_name': 'registration/login.html'},
                           name='auth_login'),
                       url(r'^logout/$',
                           auth_views.logout,
                           {'template_name': 'registration/logout.html'},
                           name='auth_logout'),
                       url(r'^password/change/$',
                           auth_views.password_change,
                           name='auth_password_change'),
                       url(r'^password/change/done/$',
                           auth_views.password_change_done,
                           name='auth_password_change_done'),
                       url(r'^password/reset/$',
                           auth_views.password_reset,
                           name='auth_password_reset'),
                       url(r'^password/reset/confirm/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$',
                           auth_views.password_reset_confirm,
                           name='auth_password_reset_confirm'),
                       url(r'^password/reset/complete/$',
                           auth_views.password_reset_complete,
                           name='auth_password_reset_complete'),
                       url(r'^password/reset/done/$',
                           auth_views.password_reset_done,
                           name='auth_password_reset_done'),
) 
'''
于 2011-06-13T00:22:45.387 回答
5

我只需要将uidb36参数更改为uidb64,如下所示:

从:

url(r'^password/reset/confirm/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$',

至:

url(r'^password/reset/confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$',

然后密码重置再次开始工作。

于 2011-12-21T20:18:28.170 回答
1

我猜你在 urls.py 中的 password_reset_confirm url 看起来类似于

url(r'^accounts/password_reset/(?P[0-9A-Za-z]{1,13})-(?P[0-9A-Za-z]{1,13}-[0-9A -Za-z]{1,20})/$', password_reset_confirm, {'post_reset_redirect' : '/accounts/password_reset/complete/'},name="password_reset_confirm"),

您在 password_reset_email.html 中的链接看起来像 {{ protocol }}://{{ domain }}{% url 'password_reset_confirm' uidb36=uid token=token %}

只需将两个地方的 uib36 更改为 uib64 即可。

于 2017-02-16T06:11:39.313 回答