2011-01-11 20 views
0

私は、ユーザが一時パスワードを使用している場合にキャッチする小さなミドルウェアを作成しました。もしそうなら、それらを新しいパスワードを作成するページにリダイレクトします。私の問題は、ユーザーがログインして一時パスワードを使用していない(つまり、パスワードパスワードを手動で変更する)ときにページが正常に動作することです。しかし、一時パスワードを使用している場合、ミドルウェアからのリダイレクトは403禁止ページ。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を発生させるコードではありませんが、このコードはそのままでは無限のリダイレクトになります。 –

+0

HttpResponseRedirect行が403を引き起こしていて、Django内のどこかに実際の403が呼び出されています。行が 'HttpResponse( "test")を返すように変更された場合、正常に動作します。したがって、リダイレクトが発生すると関係します。 –

+0

このように、これを行うための最良の方法は何か、またはミドルウェアにリダイレクトの処理を停止させる方法が問題だと思います。 –

答えて

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

実際、これは私が行った解決策です。新しい回答があったときにそれを入力していました。 –

0

Django Debug Toolbar

はここに役立つかもしれない役に立つかもしれロギングを設定し、最新のベータ版を使用している場合。リダイレクトをトラップして、実際にそこに行く前にリダイレクトする場所を示すことができます。これは壊れたリダイレクトを実行するのに役立ちます。

つまり、一時的なパスワードを持つユーザーに対しては、別の「パスワード変更」ページを使用することをお勧めします。あなたのページには@login_requiredデコレータがあり、一時的なパスワードは「本当に」ログインしたとはみなされないかもしれません。

関連する問題