Подтвердить что ты не робот

NoReverseMatch at/rest-auth/password/reset/

У меня есть приложение django с интерфейсом angular. Когда из front-end я пытаюсь отправить запрос на passwordReset, я получаю следующую ошибку:

Обратное для 'password_reset_confirm' с аргументами '()' и ключевое слово аргументы '{u'uidb64': 'MTE', u'token ': u'3z4-eadc7ab3866d7d9436cb'} ' не найдено. 0 образцов (ы): []

Его запрос POST отправляется в http://127.0.0.1:8080/rest-auth/password/reset/

Ниже мой urls.py выглядит так:

from django.conf.urls import patterns, include, url
from django.contrib import admin

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    url(r'^rest-auth/', include('rest_auth.urls')),
    url(r'^rest-auth/registration/', include('rest_auth.registration.urls')),
    url(r'^account/', include('allauth.urls'))
)
4b9b3361

Ответ 1

У меня также была эта проблема, и я нашел эту проблему github, она сказала, что нам нужно добавить

url(r'^', include('django.contrib.auth.urls')),

на urlpatterns.

Как указано там, он говорит, что представление PasswordReset зависит от представления django.contrib.auth.views.password_reset_confirm.

Ответ 2

Как отметил Рор Скаллестад, проблема заключается в шаблоне электронной почты по умолчанию, который пытается разрешить URL-адрес путем обращения имени_пользователя "password_reset_confirm", который не определен.

Достаточно зарегистрировать имя представления "password_reset_confirm" с пользовательским маршрутом, и тогда рендеринг шаблона электронной почты по умолчанию будет работать нормально.

Вы можете зарегистрировать viewname с пользовательским маршрутом, добавив путь к urls.py:

urlpatterns = [
    ...,
    path('password-reset/<uidb64>/<token>/', empty_view, name='password_reset_confirm'),
]

сброс пароля - пользовательский маршрут для просмотра подтверждения сброса пароля. Если у вас есть SPA (Angular) - это будет URL-адрес вашего представления SPA (например, маршрут к компоненту Angular), который будет обрабатывать сброс пароля.

Это URL, который будет разрешен и встроен в электронное письмо. Для этого примера это будет что-то вроде:

http://my-spa.com/app-name/password-reset/Nw/51v-490d4b372ec930e49049/

empty_view - в случае SPA (Angular) вам на самом деле не нужна реализация на стороне сервера, потому что внешний интерфейс фактически обрабатывает этот маршрут. Я использовал эту реализацию представления, но это может быть что угодно:

from django.http import HttpResponse

def empty_view(request):
    return HttpResponse('')

И так как я использую Angular, это маршрут для моего Angular компонента:

{
    path: 'password-reset/:uid/:token',
    component: PasswordRecoveryComponent
}

Ответ 3

Для меня проблема была в этой строке в site-packages/django/contrib/admin/templates/registration/password_reset_email.html:

{{ protocol }}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}

Из того, что я понимаю, проблема вызвана обратным поиском, не работающим для этой строки в contrib/auth/urls.py:

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

Мое (по крайней мере временно) решение заключалось в том, чтобы переопределить шаблон и указать код обратной ссылки URL-адреса для ссылки в письме.

Путь к новому шаблону указан в settings.py:

TEMPLATE_DIRS =(
    "/absolute/path/to/my/templates/directory",
)

Так как я использую интерфейс angular, я также изменил ссылку, чтобы он завершил подтверждение пароля reset через клиента angular:

{{ protocol }}://{{ domain }}/#/passwordResetConfirm/{{ uid }}/{{ token }}

Ответ 4

Решения @AbimaelCarrasquillo работают, но вы, вероятно, не хотите раскрывать эти конечные точки, как @dpstart, упомянутые в комментариях.

Я решил это, переопределив PasswordResetSerializer rest-auth и просто заменив форму сброса:

password_reset_form_class = PasswordResetForm

от внутреннего django.contrib.auth.forms.PasswordResetForm до allauth.account.forms.ResetPasswordForm

Обязательно добавьте следующие параметры:

REST_AUTH_SERIALIZERS = {
    'PASSWORD_RESET_SERIALIZER':'path.to.PasswordResetSerializer'
}

Ответ 5

Добавьте это в свой проект url.py file

url(r'^o/', include('oauth2_provider.urls', namespace='oauth2_provider')),
url('', include('social.apps.django_app.urls', namespace='social')),

Ответ 6

Проверьте часто задаваемые вопросы: это объясняет эту ошибку и как исправить это. Он ссылается на демонстрационную программу, которая содержит:

# this url is used to generate email content
url(r'^password-reset/confirm/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$',
    TemplateView.as_view(template_name="password_reset_confirm.html"),
    name='password_reset_confirm'),

Ответ 7

Для тех, кто все еще борется с этой проблемой, я обнаружил, что внутреннее представление с обратным поиском ищет обратный поиск в URL основного проекта, а не в каком-либо приложении. Это может работать в приложении с некоторыми изменениями, но я не уверен. Но это работает, создавая URL сброса непосредственно в основном проекте urls.py

{
    path(r'password_reset/', PasswordResetView.as_view(template_name='password_reset_form.html'), name='password_reset'),
    path(r'password_reset_done/', PasswordResetDoneView.as_view(template_name='password_reset_done.html'), name='password_reset_done'),
    path(r'password_reset_confirm/<uidb64>/<token>/', PasswordResetConfirmView.as_view(template_name='password_reset_confirm.html'), name='password_reset_confirm'),
    path(r'password_reset_complete/', PasswordResetCompleteView.as_view(template_name='password_reset_complete.html'), name='password_reset_complete'),
}

Ответ 8

Мое решение состояло в том, чтобы переопределить шаблон электронной почты, который вызывает обратную переменную "password_reset_confirm". Убедитесь, что шаблон электронной почты отправляет URL-адрес в ваше веб-приложение с UID и токеном в URL-адресе (вместо того, чтобы пытаться изменить "password_reset_confirm").

Ваш маршрутный интерфейс должен взять URL-адрес, проанализировать его, а затем обновленный пароль пользователя и отправить его обратно как вызов API для вашего бэкэнда для подтверждения.