NoReverseMatch at/rest-auth/password/reset /

bir*_*rdy 17 python authentication django

我有一个带角度前端的django应用程序.当从前端我尝试发送passwordReset请求时,我收到以下错误:

使用参数'()'和关键字参数'{u'uidb64':'MTE',u'token':u'3z4-eadc7ab3866d7d9436cb'}'找不到'password_reset_confirm'.尝试过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'))
)
Run Code Online (Sandbox Code Playgroud)

小智 30

我也遇到了这个问题,发现这个github问题我们需要补充一下

url(r'^', include('django.contrib.auth.urls')),
Run Code Online (Sandbox Code Playgroud)

在urlpatterns上.

如上所述,它说PasswordReset视图取决于django.contrib.auth.views.password_reset_confirm视图.

  • 我们不是以这种方式暴露危险的终点吗? (5认同)
  • `path('', include('django.contrib.auth.urls')),` 对我有用 (3认同)

Vit*_*ler 9

正如Roar Skullestad指出的那样,问题出在默认的电子邮件模板上,该模板试图通过反转未定义的视图名“ password_reset_confirm” 来解析URL 。

使用自定义路由注册视图名称“ password_reset_confirm”就足够了,然后默认电子邮件模板呈现将正常工作。

您可以通过向urls.py添加路径来使用自定义路由注册视图名称:

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

password-reset-密码重置确认视图的自定义路由。如果您有SPA(Angular),它将是您的SPA视图的URL(例如到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('')
Run Code Online (Sandbox Code Playgroud)

由于我使用的是Angular,因此这是我的Angular组件的路由:

{
    path: 'password-reset/:uid/:token',
    component: PasswordRecoveryComponent
}
Run Code Online (Sandbox Code Playgroud)


Roa*_*tad 5

对我来说,问题是site-packages / django / contrib / admin / templates / registration / password_reset_email.html中的这一行:

{{ protocol }}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}
Run Code Online (Sandbox Code Playgroud)

据我了解,问题是由于反向查询不适用于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'),
Run Code Online (Sandbox Code Playgroud)

我的解决方案(至少是暂时的)是覆盖模板,并对电子邮件中的链接的URL的反向查找部分进行硬编码。

新模板的路径在settings.py中指定:

TEMPLATE_DIRS =(
    "/absolute/path/to/my/templates/directory",
)
Run Code Online (Sandbox Code Playgroud)

由于我使用的是角度前端,因此我也更改了链接,以便它通过角度客户端触发密码重置确认:

{{ protocol }}://{{ domain }}/#/passwordResetConfirm/{{ uid }}/{{ token }}
Run Code Online (Sandbox Code Playgroud)