Ajaxリクエストの結果としてページ全体をリダイレクトする場合は、サーバー側のリダイレクト(Ajaxリクエスト自体のみをリダイレクトする)ではなく、クライアント上のJavascriptを介してリダイレクトする必要があります。これを実現するには、関数のターゲットとして「:eval」を指定できます。ajax()
これにより、返される応答が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を返します。
また、この関数はサーバー側のPython関数であるため、クライアント側のJavascript関数である関数URL()
内で呼び出すことはできません。ajax()
代わりに、Web2pyのテンプレート区切り文字({{ }}
)内に配置して、サーバー上のテンプレートにURLが生成されるようにする必要があります。
更新:代わりに:
return 'window.location = "%s"' % URL('default', 'index')
これで、次のことができます。
redirect(URL('default', 'index'), client_side=True)
これは舞台裏でも同じことをします。