1

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

问题是这样的:

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

4 回答 4

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

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

于 2008-12-02T11:11:45.487 回答
0

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

于 2008-12-02T10:43:07.023 回答
0

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

于 2008-12-02T11:10:45.550 回答
0

问题实际上是当我使用

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

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

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

于 2008-12-02T18:37:27.567 回答