2012-11-30 51 views
3

我正在嘗試將Mozilla Persona(browserid)集成到金字塔應用程序中。登錄過程是:金字塔視圖重定向

  1. 用戶可以通過點擊登錄按鈕
  2. 任何網頁上登錄然後一個彈出窗口顯示一個登錄表單當用戶進入正確的登錄/密碼
  3. ,Ajax調用由通過彈出窗口來檢查用戶憑據,並呼籲金字塔記得函數如果檢查成功
  4. 的BROWSERID javascript代碼,然後重新加載當前頁面

現在我要處理的CA金字塔圖這是一個新用戶訂閱網絡應用程序,並呈現一個新的視圖,詢問更多的細節(所需的用戶名等)。

由於「記住」功能是由彈出窗口中的ajax調用調用的,所以我無法將用戶重定向到「/ newuser」頁面。 因此,每當記住的瀏覽數據庫中沒有相應的用戶時,每個視圖都需要將新用戶重定向到「/ newuser」url。

有沒有辦法攔截用戶請求之前調用視圖來調用「new_user」視圖呢?或者,也許我的身份驗證方法根本不正確,我應該依靠另一種方法?

回答

4

這樣做的一種方法是創建用戶創建時應引發的異常,並將此異常用作重定向到新頁面的視圖的上下文。

class NewUser(Exception): 
    pass 

@view_config(context=NewUser) 
def new_user_exception(request): 
    return HTTPFound(request.route_path('new_user')) 

確保異常第一登錄後的第一請求中提出的(在已經創建的用戶對象,例如),並且用戶將被重定向到正確的頁面。

您也可以將歡迎頁面的代碼直接放在new_user_exception中,但是如果沒有重定向,這個頁面會讓用戶詢問網址,不管它是什麼。


另一種解決方案是調整人物角色的部分是如何完成的。爲此,我猜你正在使用pyramid_persona(我是作者:))。如果不是,我所說的話仍然適用,而且會更簡單。

你可以做的是:

  • 更改登錄視圖,以便它在響應包括布爾說這是否是第一次登陸與否。
  • 更改javascript以檢查此布爾值,如果不是第一次重新加載頁面,並且如果它重定向到歡迎頁面。

的登錄查看代碼可以使用pyramid_persona的登錄觀點是這樣的:

from pyramid_persona.views import login 

@view_config(route_name='login') 
def new_login(request): 
    response = login(request) 
    if response.status == 200: #the login worked 
     # tweak the response 
    return response 

編輯:現在有pyramid_persona文檔中關於這項工作的一部分:Do extra work or verification at login

+0

感謝您的回答。我想知道哪裏是提升NewUser例外的好地方。我現在在一個NewRequest訂戶中調用它來檢查數據庫中的用戶標識。 – ascobol

+0

NewRequest訂閱者並不是一個糟糕的地方,因爲它需要在每個請求中調用。不要忘記將查詢結果放在請求對象中,因此您不必在視圖中再次執行該操作。 – madjar