django anonymous_required пользовательский декоратор конфликтует с представлениями password_reset - PullRequest
0 голосов
/ 17 апреля 2011

Я использую встроенные функции auth_views.password_reset(_confirm, _done, _complete), и я хотел бы ограничить доступ к этим представлениям только не вошедшим (анонимным) пользователям, поскольку для вошедших пользователей не имеет смысла:сбросить свой пароль.

Я нашел противоположность @login_required по этой ссылке: http://passingcuriosity.com/2009/writing-view-decorators-for-django/

Декоратор работает для auth_views.password_reset.Я использую его в своих URL как таковых

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

По некоторым причинам он не работает с другими 3 представлениями.Например, следующий URL:

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

выдает мне следующую ошибку:

Значение исключения:
Обратное значение для django.contrib.auth.views.password_reset_done сАргументы '()' и ключевые слова Аргументы '{}' не найдены.

Может кто-нибудь сказать мне, почему?

Данный код декоратора:

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 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)

1 Ответ

0 голосов
/ 03 мая 2011

Я вижу, что password_reset включает в себя обратную процедуру, упомянутую в сообщении об ошибке.Он пытается сделать это наоборот, но вы переопределили это или не включили его в 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')
...