получение цикла перенаправления для декоратора admin_only - PullRequest
1 голос
/ 02 декабря 2008

Я сделал этот декоратор, что приводит к бесконечному циклу перенаправления.

Проблема заключается в следующем:

args[0].redirect(users.create_login_url(args[0].request.path))

Похоже, это совершенно правильный URL. Так почему бы не правильно перенаправить?

def admin_only(handler, *args):

    def redirect_to_login(*args, **kwargs):
        return args[0].redirect(users.create_login_url(args[0].request.path))

    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
    else:
        return redirect_to_login

Ответы [ 4 ]

2 голосов
/ 02 декабря 2008

Похоже, вы не определяете свой декоратор должным образом.

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

Попробуйте что-то вроде этого:

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

Обратите внимание, что в приведенном выше коде декоратор просто определяет новую функцию и возвращает ее, а сама эта новая функция выполняет соответствующие проверки.

0 голосов
/ 02 декабря 2008

Проблема на самом деле, когда я использую

return args[0].redirect(users.create_logout_url(args[0].request.uri))

Переходит на страницу выхода из системы, которая затем перенаправляет на текущую страницу. Тем не менее, мои журналы показывают, что текущая страница думает, что я все еще вошел в систему, даже после завершения выхода.

Это странно, поскольку я ничего не модифицировал в API пользователей движка приложений.

0 голосов
/ 02 декабря 2008

Вы должны использовать firebug, или live http заголовки, или что-то подобное, чтобы увидеть, что именно здесь происходит. Мое предположение: Ваша функция authorized () всегда возвращает false (даже когда пользователь вошел в систему), поэтому она перенаправляет на страницу входа, которая (если пользователь уже вошел в систему) немедленно перенаправляет пользователя обратно на вашу страницу, что перенаправляет ... вы поняли.

0 голосов
/ 02 декабря 2008

Вы уверены, что отправляется правильный код состояния, вы можете использовать надстройку HTTP-заголовков для Firefox, чтобы проверить, отправляются ли 301 или 303 или нет.

...