2

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

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

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

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

2 回答 2

5

如果您希望整个页面作为 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)

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

于 2012-04-25T21:23:34.870 回答
2

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

{{if auth.is_logged_in():}}
于 2012-07-23T20:22:51.887 回答