2011-12-28 10 views
0

djangoでは、viewに対してlogin_required()が呼び出される直前に特定のアクションを実行したいと考えています。 1つのハックまたは簡単な方法は、ログインが必要でないビューへのURLのポイントを指定し、その特定のアクション(action:request.session内のいくつかの設定)を行い、ログインが必要なこのメインビューにリダイレクトします。login_requiredが呼び出される直前にDjangoがアクションを実行しますか?

ジャンゴでこのようなことに対応するオプションがあれば、どうすればいいですか?

これを行うには自分のデコレータを書くよりも簡単な方法がありますか?

+1

あなたのハッキングは、あなたの行動が実行されることを保証するものではありません。 'login_required'でビューのURLを知っているユーザーは、他のビューを簡単にバイパスできます。残念ながら、私はあなたの問題の解決策を知らない。 –

答えて

1

これにアプローチするには、独自のデコレータを書くことが最適です。 @login_requiredを持っている場所であれば、login_requiredデコレータに加えて独自のデコレータを追加するだけです。

また、デコレータからlogin_required関数を呼び出すこともできます。

+0

Djangoデコレータを置き換える必要はありません。ちょうど適切な場所に独自のデコレータを追加すると、順番に呼び出されます。 – demalexx

+0

私ははっきりしていませんでした。私は両方を追加すると言っていたので、私は答えを編集してより明確にするつもりです。 – Jordan

1

代わりにuser_passes_testデコレータを使用して、認証されていることを手動で検証する前にカスタムのものを実行してください。参照:https://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.decorators.user_passes_test

+0

+1: 'login_required'デコレータは実際に' user_passes_test'を内部的に使用していますので、これはおそらく動作します。私はまだ、OPの例に基づいてミドルウェアが適切なアプローチだと考えています。 – elo80ka

+0

ミドルウェアは、おそらくナイフ戦闘にバズーカを投入する可能性が高いです。 'user_passes_test'は彼がすでに使っている' login_required'デコレータを単に置き換え、必要な余分な変数を追加するためにセッションへのアクセスを許可します。 –

2

デコレータは、コードを分かりやすくしてセキュリティ上の理由から、リダイレクトをブロックできるため、これを避ける方法を考える必要があります。

このarcticleは有用なようですHow to make a chain of function decorators?、私はあなたがリクエスト変数を渡す必要があると思うので、あなたのデコレータを最初にチェックしてください。

1

あなたの質問には詳細はありませんが、ご参考までに(いくつかのリクエスト変数を設定して)、Request Middlewareのように聞こえます。例えば組み込みdjango.contrib.auth.middleware.AuthenticationMiddlewareを見てみましょう:

class AuthenticationMiddleware(object): 
    def process_request(self, request): 
     assert hasattr(request, 'session'), "The Django authentication middleware requires session middleware to be installed. Edit your MIDDLEWARE_CLASSES setting to insert 'django.contrib.sessions.middleware.SessionMiddleware'." 

     request.user = SimpleLazyObject(lambda: get_user(request)) 

あなたは(上記のように)process_requestメソッドを持つクラスを定義する必要があります。 process_requestメソッドはリクエストごとに呼び出され、リクエストインスタンスが渡されます。この方法では、request.userを確認し、ユーザーが認証されていれば、現在の要求に必要な変数を設定できます。

関連する問題