0

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

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

これを行うために独自のデコレータを作成するよりも簡単な方法はありますか?

4

4 に答える 4

2

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

関数デコレータのチェーンを作成するにはどうすればよいですか? 、リクエスト変数を渡し、最初にチェックを処理するようにデコレーターを配置する必要があると思うからです。

于 2011-12-28T22:09:36.990 に答える
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、ユーザーが認証されているかどうかを確認し、現在のリクエストに必要な変数を設定できます。

于 2011-12-29T06:10:52.983 に答える
1

これにアプローチするには、独自のデコレータを作成するのが最善の方法です。@login_required がある場所ならどこでも、login_required デコレーターに加えて独自のデコレーターを追加するだけです。

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

于 2011-12-28T22:04:01.937 に答える
1

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

于 2011-12-28T22:09:36.803 に答える