如果您希望整个页面作为 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)
这将在幕后做同样的事情。