2011-01-11 44 views
0

我已經寫了一小部分中間件,用於捕獲用戶是否使用臨時密碼,如果是,則將它們重定向到強制他們創建新密碼的頁面。我的問題是,當用戶登錄並且沒有使用臨時密碼(即他們手動進入更改密碼URL)時,頁面可以正常工作,但是當他們使用臨時密碼時,來自中間件的重定向會生成403 Forbidden頁面。Django process_view中間件導致403被禁止

中間件做一件事在process_view臨時密碼校驗後,但這是相關代碼:

class MyMiddleware(object): 
    def process_view(self, request, view_func, view_args, view_kwargs): 
    if request.user.is_authenticated(): 
     try: 
     if request.user.get_profile().using_temp: 
      return HttpResponseRedirect(reverse('change_password')) 
     except Object.DoesNotExist: 
      pass 
     # Not using temp password, let the request process 
     return None 

注意,呈現直接的模板可以使用的東西,如選擇render_to_response,修復問題,但這會導致瀏覽器的URL不能跟上,以及它無法真正退出它呈現的頁面。

+0

這不是引發403的代碼。但是,這段代碼會導致無限重定向。 – 2011-01-11 13:23:35

+0

HttpResponseRedirect行導致403,在Django內部的某個地方,實際的403被引發。如果該行被更改爲'return HttpResponse(「test」)',它可以正常工作,所以它確實與重定向觸發有關。 – 2011-01-11 14:13:05

回答

2

首先,我認爲您的縮進在示例中是關閉的,但如何將以下解決方案作爲檢測當前路徑 change_password URL?這應該擺脫你正在進行的無限重定向。

class MyMiddleware(object): 
    def process_view(self, request, view_func, view_args, view_kwargs): 
    if request.user.is_authenticated(): 
     try: 
     if request.user.get_profile().using_temp and request.path != reverse('change_password'): 
      return HttpResponseRedirect(reverse('change_password')) 
     except Object.DoesNotExist: 
      pass 
    # Not using temp password, let the request process 
    return None 
0

Django Debug Toolbar可能會有所幫助在這裏。它可以捕獲重定向並在實際出現之前向您顯示重定向的位置。這有助於運行破碎的重定向。這就是說,我建議爲臨時密碼的用戶使用不同的「更改密碼」頁面,因此它可以以不同方式處理權限檢查。您可能擁有一個@login_required裝飾器,並且臨時密碼可能不會被視爲「真正」登錄。