Проблема Django-nonrel + Django-регистрация: неожиданный аргумент ключевого слова 'uidb36' при сбросе пароля - PullRequest
20 голосов
/ 12 июня 2011

Я использую Django-nonrel с регистрация приложение. Кажется, все работает нормально, за исключением случаев, когда я пытаюсь сбросить пароль. При нажатии на ссылку сброса пароля, отправленную мне по электронной почте, Django выдает сообщение об ошибке:

password_reset_confirm() got an unexpected keyword argument 'uidb36'

Мой вопрос: кто-нибудь видел это и знает, что такое лекарство?

EDIT:

Проблема вызвана регистрацией \ auth_urls.py - они дублируют записи в django \ contrib \ auth \ urls.py, обходя исправленную версию файла в Django-nonrel.

Есть идеи, почему он есть, и могу ли я на самом деле удалить его или исправить другим способом?

Ответы [ 4 ]

34 голосов
/ 04 декабря 2013

Django 1.6 использует кодировку Base 64 для идентификатора пользователя вместо кодировки Base 36.

Если у вас есть пользовательские URL-адреса для сброса пароля, вам нужно будет обновить их, заменив uidb36 на uidb64 и следующую чертуэтот шаблон с косой чертой.Также добавьте «_», «\» и «-» в список символов, которые могут соответствовать шаблону uidb64.

Например, эта строка в urls.py в Django 1.5 -:

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

9 голосов
/ 13 июня 2011

Мое решение состояло в том, чтобы закомментировать urlpatterns, определенные в registration \ auth_urls.py, и переопределить их как копию urlpatterns, определенных в django.contrib.auth.

Вот мой 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'),
) 
'''
5 голосов
/ 22 декабря 2011

Мне просто нужно было изменить аргумент uidb36 на uidb64, например:

ОТ:

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

TO:

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

ТогдаСброс пароля снова начал работать.

1 голос
/ 16 февраля 2017

Полагаю, ваш URL password_reset_confirm в urls.py выглядит примерно так:

URL (г '^ счета / password_reset / (Р [0-9A-Za-Z] {1,13}) -? (Р [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 = токен%}

Просто измените uib36 на uib64 в обоих местах, все работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...