Javascript 如何在web2py中从视图动态检查登录状态

Javascript 如何在web2py中从视图动态检查登录状态,javascript,python,ajax,web2py,Javascript,Python,Ajax,Web2py,我需要检查用户是否仍在登录,以便在会话过期(已注销但页面尚未刷新)时阻止他们打开表单 这是我试图做的伪代码,显然不起作用 // some view.html $('#someform').click(function() { ajax(URL('login_status'), [], ''); }); // some controller.py def login_status(): if not auth.user: redirect('index') 如果

我需要检查用户是否仍在登录,以便在会话过期(已注销但页面尚未刷新)时阻止他们打开表单

这是我试图做的伪代码,显然不起作用

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

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

如果希望整个页面作为Ajax请求的结果重定向,那么必须通过客户端上的Javascript而不是服务器端重定向(服务器端重定向只会重定向Ajax请求本身)。要实现这一点,可以在
ajax()
函数中指定“:eval”作为目标,这将导致返回的响应作为Javascript代码执行(请参阅)。比如说:

$('#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

更新:而不是:

return 'window.location = "%s"' % URL('default', 'index')
您现在可以执行以下操作:

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

这将在幕后做同样的事情。

此外,这可能会有所帮助:

{{if auth.is_logged_in():}}

那就对了!谢谢Anthony。当页面第一次返回到浏览器时,这将非常有用,但如果页面加载后登录状态发生更改,则不会更新。