6

Django bookの第8 章には、任意の 1 つの URLconf から渡された別のビュー メソッドを受け取る、基本的なビュー ラップ メソッドを示す例があります。

def requires_login(view):
    def new_view(request, *args, **kwargs):
        if not request.user.is_authenticated():
            return HttpResponseRedirect('/accounts/login/')
        return view(request, *args, **kwargs)
    return new_view

new_viewここではほとんどのロジックに従いますが、ネストされた定義がリクエスト、*args および **kwargs を明示的に定義に渡されていないため、どのように受け取っているのか理解できませんrequires_login

new_view定義はこれらの引数をどの程度正確に受け取っていますか?

4

1 に答える 1

4

仕組みnew_view_

new_viewまず、関数を見てみましょう。

def new_view(request, *args, **kwargs):
    if not request.user.is_authenticated():
        return HttpResponseRedirect('/accounts/login/')
    return view(request, *args, **kwargs)

new_view呼び出されると、ユーザーが認証されているかどうかを確認します。ユーザーが認証されている場合は、すべての引数( 、位置引数、およびキーワード引数)をnew_view呼び出しviewて渡します。request

new_viewの定義

new_view自動的には実行されません。関数の定義に使用defしていますが、すぐには実行していません。代わりにnew_view、関数として戻ります。次のコードを想像してみてください。

def my_view(request):
    # ... some view stuff happens here

my_new_view = requires_login(my_view)

さて、my_new_viewは関数です。他の関数と同じように呼び出すことができます。これまでのところ、この新しい関数が実際に呼び出されたことはありません。

my_new_view呼び出されると、すべての引数を受け取ります。次に、を呼び出し、代わりにすべての引数( 、位置引数、およびキーワード引数)をmy_view渡します。requestmy_view

(もちろん、これはすべて、ユーザーが認証されていることを前提としています。そうでない場合、を呼び出すとmy_new_view、が取得され、呼び出されることはHttpResponseRedirectありmy_viewません。)

view議論として

requires_loginview引数として呼び出される関数を受け取ります。view関数を参照していますが、まだその関数を実行していません。viewが実行されたときにのみnew_view実行されます。

于 2010-02-19T07:43:52.837 に答える