Skip to content Skip to sidebar Skip to footer

Noreversematch At /rest-auth/password/reset/

I have a django application with an angular front-end. When from the front-end I try to send a request for passwordReset, I get the following error: Reverse for 'password_reset_co

Solution 1:

I also was having this problem, and found this github issue it said we need to add

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

on the urlpatterns.

As stated there it says that The PasswordReset view depends on django.contrib.auth.views.password_reset_confirm view.

Solution 2:

As Roar Skullestad pointed out, the problem is with the default email template, which tries to resolve URL by reversing viewname "password_reset_confirm", which is undefined.

It is enough to register a viewname "password_reset_confirm" with a custom route and then default email template rendering will work fine.

You can register viewname with custom route by adding a path to urls.py:

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

password-reset - custom route that password reset confirmation view. If you have SPA (Angular) - it will be the URL of your SPA view (such as the route to Angular component) that will handle the password reset.

This is the URL that will be resolved and embedded in the email. For this example it will be something like:

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

empty_view - in case of SPA (Angular), you don't really need server-side implementation, because the front end will actually handle this route. I used this implementation of a view, but it can be anything else:

from django.http import HttpResponse

defempty_view(request):
    return HttpResponse('')

And since I'm using Angular, this is the route for my Angular component:

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

Solution 3:

For me the problem was this line in site-packages/django/contrib/admin/templates/registration/password_reset_email.html:

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

From what I understand the problem is caused by reverse lookup not working for this line in 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'),

My (at least temporarily) solution was to override the template and hardcode the reverse lookup part of the url for the link in the email.

The path to the new template is specified in settings.py:

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

Since I am using angular front end, I also changed the link so that it triggers password reset confirmation via the angular client:

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

Solution 4:

@AbimaelCarrasquillo's solutions works but you probably do not want to expose those endpoints as @dpstart mentioned in the comments.

I solved this by overriding the PasswordResetSerializer of rest-auth and simply replacing the reset form:

password_reset_form_class = PasswordResetForm

from the internal django.contrib.auth.forms.PasswordResetForm to allauth.account.forms.ResetPasswordForm

Make sure to add the following to your settings:

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

Solution 5:

Well I was also facing this problem. Every time I entered my email and pressed the button it took me to NoReverseMatch url, and I am using:

re_path(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')

(url is not used to match regex in django anymore re_path is used)

My solution is to change the regex a little bit because the "csrf token" is longer than 20 words – that's why I was getting an error and you should try the same.

re_path(r'^password-reset/confirm/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,40})/$',
TemplateView.as_view(template_name="password_reset_confirm.html"),
name='password_reset_confirm')

You can either use + (in regex it means one or more) or {1,40}(in regex it means match from 1 to 40)

Post a Comment for "Noreversematch At /rest-auth/password/reset/"