Похоже, вы не определяете свой декоратор должным образом.
Декоратор вызывается только один раз каждый раз, когда вы оборачиваете функцию; с этого момента будет вызываться функция, возвращаемая декоратором . Кажется, вы (ошибочно) уверены, что сама функция декоратора будет вызываться каждый раз.
Попробуйте что-то вроде этого:
def redirect_to_login(*args, **kwargs):
return args[0].redirect(users.create_login_url(args[0].request.path))
def admin_only(handler):
def wrapped_handler(*args, **kwargs):
user = users.get_current_user()
if user:
if authorized(user):
return handler(args[0])
else:
logging.warning('An unauthorized user has attempted '
'to enter an authorized page')
return redirect_to_login(*args, **kwargs)
else:
return redirect_to_login(*args, **kwargs)
return wrapped_handler
Обратите внимание, что в приведенном выше коде декоратор просто определяет новую функцию и возвращает ее, а сама эта новая функция выполняет соответствующие проверки.