Я пытаюсь украсить представление 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?