я не знаю пилонов, но похоже, что вы написали свой декоратор не очень хорошо.
декоратор является вызываемым, который должен возвращать вызываемое . декоратор вызывается в тот момент, когда функция определена, и он должен возвращать вызываемый объект (обычно функцию), который будет вызываться вместо декорируемой функции.
в вашем примере ваш декоратор возвращает вызываемый объект, только если пользователь аутентифицирован в тот момент, когда определена функция index()
.
попробуйте переписать это так:
def authenticate(func):
def call(*args, **kwargs):
if user['authenticated'] is True:
return func(*args,**kwargs)
else:
return redirect_to(controller='login', action='index')
return call
здесь, authenticate()
определяет внутреннюю функцию, которая возвращается вместо функции, которую она украшает. Теперь, когда вы украшаете функцию с помощью этого декоратора:
@authenticate
def index(self):
return render('/index.mako' )
это означает, что каждый раз, когда вы вызываете index()
, вы фактически вызываете внутреннюю функцию, объявленную в вашем декораторе.
Вы должны заметить, что: благодаря тому, как функции определены в python, объект функции, возвращаемый декоратором, все еще запоминает значение аргументов функции, в которой он был определен. call()
все еще знает об аргументе func
, который был передан при вызове декоратора. (это называется закрытием)
декораторы сложны для понимания, хотя и не сложны. Вам следует поискать в Google учебник по декораторам: их много, и они очень хорошо понимают концепцию, гораздо более понятную, чем документация по питону.