Помогите с авторизацией и перенаправлением декоратора в python (пилоны) - PullRequest
1 голос
/ 27 апреля 2010

Я пытаюсь написать простой декоратор, чтобы проверить аутентификацию пользователя и перенаправить на страницу входа, если он / она не аутентифицирован:

def authenticate(f):
    try:
        if user['authenticated'] is True:
            return f
    except:
        redirect_to(controller='login', action='index')

class IndexController(BaseController):
    @authenticate
    def index(self):
        return render('/index.mako' )

Но этот подход не работает. Когда пользователь проходит проверку подлинности, все в порядке. Но когда пользователь не аутентифицирован, redirect_to () не работает, и я получаю эту ошибку:

HTTPFound: 302 Found Content-Type: text/html; charset=UTF-8 Content-Length: 0 location: /login

Спасибо за помощь!

1 Ответ

5 голосов
/ 27 апреля 2010

я не знаю пилонов, но похоже, что вы написали свой декоратор не очень хорошо.

декоратор является вызываемым, который должен возвращать вызываемое . декоратор вызывается в тот момент, когда функция определена, и он должен возвращать вызываемый объект (обычно функцию), который будет вызываться вместо декорируемой функции.

в вашем примере ваш декоратор возвращает вызываемый объект, только если пользователь аутентифицирован в тот момент, когда определена функция 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 учебник по декораторам: их много, и они очень хорошо понимают концепцию, гораздо более понятную, чем документация по питону.

...