开发者

django anonymous_required custom decorator clashing with password_reset views

开发者 https://www.devze.com 2023-02-27 02:54 出处:网络
I am using the built-in auth_views.password_reset(_confirm, _done, _complete)functionalities, and I would like to limit access to these views only to non-logged-in (anonymous) users, because it doesn\

I am using the built-in auth_views.password_reset(_confirm, _done, _complete)functionalities, and I would like to limit access to these views only to non-logged-in (anonymous) users, because it doesn't make sense for logged-in users to reset their password.

I found the opposite of @login_required at this link: http://passingcuriosity.com/2009/writing-view-decorators-for-django/

The decorator works for auth_views.password_reset. I use it in my urls as such

 url(r'^password/reset/$',
                       anonymous_required(auth_views.password_reset),
                       name='auth_password_reset'),

For some reason it does not work with the other 3 views. For example the following url:

url(r'^password/reset/done/$',
                       anonymous_required(auth_views.password_reset_done),
                       name='auth_password_reset_done'),

gives me the following error:

Exception Value:

Reverse for 'django.contrib.auth.views.password_reset_done' with arguments '()' and keyword arguments '{}' not found.

Can anyone tell me why?

The decorator code given is:

def anonymous_required(function=None, home_url=None, redirect_field_name=None):
"""Check that the user is NOT logged in.

This decorator ensures that the view functions it is called on can be
accessed only by anonymous users. When an authenticated user accesses
such a protected view, they are redirected to the address specified in
the field named in `next_field` or, lacking such a value, the URL in
`home_url`, or the `USER_HOME_URL` setting.
"""
if home_url is None:
    home_url = settings.USER_HOME_URL

def _dec(view_func):
    def _view(request, *args, **kwargs):
        if request.user.is_authenticated():
            url = None
            if redirect_field_name开发者_JS百科 and redirect_field_name in request.REQUEST:
                url = request.REQUEST[redirect_field_name]
            if not url:
                url = home_url
            if not url:
                url = "/"
            return HttpResponseRedirect(url)
        else:
            return view_func(request, *args, **kwargs)

    _view.__name__ = view_func.__name__
    _view.__dict__ = view_func.__dict__
    _view.__doc__ = view_func.__doc__

    return _view

if function is None:
    return _dec
else:
    return _dec(function)


I see password_reset includes a reverse of the routine mentioned in the error message. Is it trying to do this reverse but you have overridden it, or not included it in the urls.conf?

django/contrib/auth/views.py:141-142 (v1.3)

if post_reset_redirect is None:
    post_reset_redirect = reverse('django.contrib.auth.views.password_reset_done')
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号