2012-04-25 56 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