Django выполнить действие перед вызовом login_required? - PullRequest
0 голосов
/ 29 декабря 2011

В django я хочу выполнить определенное действие перед вызовом login_required () для представления. Один хак или простой выход - просто указать URL-адрес на представление, где вход в систему не требуется, и выполнить это конкретное действие (действие: установка некоторых параметров в request.session), а затем перенаправить обратно на это основное представление, где требуется вход в систему. .

Как мне поступить, если в django есть какая-то возможность угождать таким вещам?

Есть ли лучший или более простой способ, чем написать собственный декоратор для этого?

Ответы [ 4 ]

2 голосов
/ 29 декабря 2011

Декоратор - лучший способ, потому что он облегчает понимание кода и, в целях безопасности, пользователь может блокировать перенаправления, поэтому вам нужно подумать, как этого избежать.

Эта статья кажется полезной Как создать цепочку функциональных декораторов? , потому что я думаю, что вам нужно будет передать переменную запроса, а также поместить свой декоратор для обработки проверки в первую очередь.

1 голос
/ 29 декабря 2011

Ваш вопрос не дает подробностей, но, исходя из вашего примера (установка некоторых переменных запроса), он звучит так, как будто вам нужно Запрос промежуточного программного обеспечения .Взгляните на встроенный django.contrib.auth.middleware.AuthenticationMiddleware для примера:

class AuthenticationMiddleware(object):
    def process_request(self, request):
        assert hasattr(request, 'session'), "The Django authentication middleware requires session middleware to be installed. Edit your MIDDLEWARE_CLASSES setting to insert 'django.contrib.sessions.middleware.SessionMiddleware'."

        request.user = SimpleLazyObject(lambda: get_user(request))

Вам нужно определить класс с помощью метода process_request (как показано выше).Метод process_request будет вызываться для каждого запроса и передаваться экземпляру запроса.Внутри метода вы можете проверить request.user, аутентифицирован ли пользователь и установить любые переменные, которые вы хотите для текущего запроса.

1 голос
/ 29 декабря 2011

Просто используйте взамен user_passes_test декоратор и сделайте ваши собственные вещи, прежде чем вручную проверять их подлинность.Смотри: https://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.decorators.user_passes_test

1 голос
/ 29 декабря 2011

Написание собственного декоратора - лучший способ приблизиться к этому. В любом месте, где у вас есть @login_required, просто добавьте свой собственный декоратор в дополнение к декоратору login_required.

Или вы можете вызвать функцию login_required из вашего декоратора.

...