2012-04-25 57 views
2

我需要检查用户是否仍然登录,以便我可以防止他们甚至在他们的会话过期时打开表单(注销但页面尚未刷新)。如何从web2py中查看动态检查登录状态

这是我正在尝试做的伪代码,显然不起作用。

// some view.html 
$('#someform').click(function() { 
    ajax(URL('login_status'), [], ''); 
}); 

// some controller.py 
def login_status(): 
    if not auth.user: 
     redirect('index') 

回答

3

如果你想整个页面作为Ajax请求的结果重定向,你必须通过JavaScript做客户端服务器端重定向上,而不是通过(这只会重定向阿贾克斯请求自己)。要做到这一点,您可以在ajax()函数中指定“:eval”作为目标,这将导致返回的响应以Javascript代码的形式执行(请参阅here)。所以,像这样:

$('#someform').click(function() { 
    ajax("{{=URL('default', 'login_status')}}", [], ':eval'); 
}); 

// some controller.py 
def login_status(): 
    if auth.user: 
     return 'this.show()' # or appropriate Javascript code to show the form 
    else: 
     return 'window.location = "%s"' % URL('default', 'index') 

因此,Ajax调用返回JavaScript,要么显示形式或重定向的页面,这取决于用户是否登录

而且,请注意,URL()功能。一个服务器端的Python函数,所以你不能在ajax()函数中调用它,这是一个客户端的Javascript函数。相反,您必须将其放入web2py的模板分隔符({{ }})中,以便在服务器上的模板中生成URL。

UPDATE:相反的:

return 'window.location = "%s"' % URL('default', 'index') 

,你现在可以做的:

redirect(URL('default', 'index'), client_side=True) 

将做幕后同样的事情。

+0

这击中当场!谢谢安东尼。 – profitehlolz 2012-04-26 15:17:11

2

而且,这可能会有帮助:

{{if auth.is_logged_in():}} 
+0

当页面首次返回到浏览器时这会很有用,但如果页面加载后登录状态发生更改,则不会更新。 – Anthony 2013-01-22 13:56:57