【问题标题】:Django-nonrel + Django-registration problem: unexpected keyword argument 'uidb36' when resetting passwordDjango-nonrel + Django-registration 问题:重置密码时出现意外的关键字参数“uidb36”
【发布时间】:2011-09-13 12:14:13
【问题描述】:

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

password_reset_confirm() got an unexpected keyword argument 'uidb36'

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

编辑:

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

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

【问题讨论】:

    标签: django google-app-engine django-nonrel django-registration


    【解决方案1】:

    我的解决方案是注释掉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'),
    ) 
    '''
    

    【讨论】:

    • 您使用的是哪个 Django 版本?我遇到了同样的问题,但是我的身份验证应用程序的文件结构似乎与您的有点不同。
    • 我已经下载了最新的 Django-nonrel。查看我的 django_init_ 我看到:VERSION = (1, 3, 0, 'final', 0),所以那一定是 Django 1.3。
    【解决方案2】:

    我只需要将 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>.+)/$',
    

    然后密码重置又开始起作用了。

    【讨论】:

      【解决方案3】:

      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

      【讨论】:

      • 如果我错了,请纠正我,但这个问题早于 django 1.6,对吗?不过,一个很好的链接,有很好的信息
      • 他可能正在使用 beta 版本,或者注册应用程序更新了他们的 URL 模式。无论哪种方式,我都认为解决方案对他有用。
      【解决方案4】:

      我猜你在 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})/$', 密码重置确认, {'post_reset_redirect' : '/accounts/password_reset/complete/'},name="password_reset_confirm"),

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

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

      【讨论】:

        猜你喜欢
        • 2014-11-22
        • 2011-08-25
        • 2011-12-28
        • 2013-10-29
        • 2022-01-18
        • 1970-01-01
        • 1970-01-01
        • 2021-10-29
        • 1970-01-01
        相关资源
        最近更新 更多