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
视图.
正如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)
对我来说,问题是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)
归档时间: |
|
查看次数: |
7135 次 |
最近记录: |