在web2py中auth.requires_membership失败时重定向到特定页面
我需要在用户不是某个特定组的成员时,把他们重定向到一个特定的页面。现在我想在我的控制器上使用requires_membership这个装饰器。
如果我理解文档没错的话,我可以在otherwise
这个参数里指定一个字符串,这样在失败时就可以把用户重定向到一个页面:
@auth.requires_membership(group_id='fornitori', otherwise='/failure-page')
def index():
return {}
不过,这个方法并没有奏效,看看代码后发现,otherwise这个参数似乎只适用于requires_login这个装饰器。
我是不是做错了什么,还是说这是web2py的一个bug?
你知道有没有其他简单的方法来实现这个重定向吗?
2 个回答
0
我再补充一点。正如答案中提到的,'otherwise' 并不是你想的那样工作。不过,如果你还是想传递参数,可以这样做:
def check_membership(target_group, new_url="none"):
def docheck():
if len(auth.user_groups.values()) == 0: # If no user is present
return auth()
for x in target_group:
if auth.has_membership(group_id=x, cached=True):
return True
if new_url == "none":
return False
redirect(URL('default', new_url))
return False
return docheck
@auth.requires(check_membership(['admin'], 'teacher_page'))
def index():
# Your code goes here
3
otherwise
这个东西在这个装饰器里也是可以用的,但它只在登录失败的时候有效,而不是在授权失败的时候。如果你想让重定向在授权失败时也生效,有两个选择。首先,auth.settings.on_failed_authorization
可以是一个函数,这样你就可以写一个函数,检查请求的控制器、函数和参数,然后根据请求返回不同的重定向网址。第二,你可以自己写一个“需要”的函数,来处理重定向的事情:
def check_membership():
if not auth.has_membership(group_id='fornitori'):
redirect(URL('default', 'other'))
@auth.requires(check_membership)
def index():
etc.