为admin_only装饰器获取重定向循环

时间:2008-12-02 09:47:09

标签: python google-app-engine redirect decorator

我制作了这个装饰器,导致无限重定向循环。

问题在于:

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

它似乎是一个完全有效的网址。那么为什么它不能正确重定向?

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 个答案:

答案 0 :(得分:2)

您似乎没有正确定义装饰器。

每次用函数包装函数时,装饰器只被调用一次;从那时起将调用装饰器返回的功能。您(错误地)认为每次都会调用装饰函数本身

尝试这样的事情:

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

请注意,在上面的代码中,装饰器只是定义了一个新函数并返回它,这个新函数本身就会进行相关的检查。

答案 1 :(得分:0)

您确定正在发送正确的状态代码,您可以使用实时http标头附加组件来检查是否正在发送301或303。

答案 2 :(得分:0)

你应该使用firebug,或者使用http标头,或者某些东西来看看这里到底发生了什么。我的猜测:你的授权()函数总是返回false(即使用户已登录),因此它会重定向到登录页面,如果用户已经登录,会立即将用户重定向回你的页面,重定向......你明白了。

答案 3 :(得分:0)

问题实际上是在我使用

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

这将转到注销页面,然后重定向到当前页面。但是,我的日志显示当前页面认为即使在注销完成后我仍然登录。

这很奇怪,因为我没有修改app引擎用户API中的任何内容。