我制作了这个装饰器,导致无限重定向循环。
问题在于:
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
答案 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中的任何内容。