2008-12-02 6 views
1

我做了这个装饰器,导致无限的重定向循环。获取重定向循环admin_only装饰器

问题是这样的:

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 

回答

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 

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

0

您确定正在发送正确的状态码吗?您可以使用Firefox的live http头文件来检查是否正在发送301或303。

0

你应该使用萤火虫或活的http头或其他东西,看看究竟发生了什么。我的猜测:您的授权()函数始终返回false(即使用户已登录),因此它会重定向到登录页面(如果用户已经登录),会立即将用户重定向回您的页面,重定向...你明白了。

0

这个问题实际上就是当我使用

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

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

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