Я пытаюсь украсить представление Django двумя декораторами, один для проверки входа в систему и один для проверки is_active.
Первый - встроенный @login_required
, а второй -следующее:
def active_required(function):
dec = user_passes_test(lambda u: u.is_active, '/notallowed', '')
return dec(function)
Теперь декораторы в Python работают наизнанку, однако следующее не работает:
@active_required
@login_required
def foo(request):
...
Я хочу сначала проверить, вошел ли пользователь в систему, иперенаправить на страницу входа, если нет, и если он или она вошли в систему, я хочу проверить, активен ли он или она, и, если нет, выполнить перенаправление на '/notallowed'
.
В результате происходит сбой login_required, пользователь не перенаправляется на страницу входа в систему, но выполняется @active_required
, и, поскольку в этом случае пользователь имеет значение null, происходит сбой декоратора @active_required, и пользовательперенаправлен на /notallowed
.
Изменение порядка, кажется, работает,
@login_required
@active_required
def foo(request):
...
но я подозреваю, что с этим подходом тоже что-то не так.
Что является правильнымспособ объединения двух декораторов, и почему порядок выполнения отличается от простых декораторов Python?