web-dev-qa-db-ja.com

djangoではディスパッチは何に使用されますか?

特にDjango(下記のコード例を参照してください)で、ディスパッチメソッドに頭を包み込もうとしています。しかし、それが何をするのか正確に理解できないようです。 Django docsからの理解ですが、このトピックに関する有益な情報は見つかりませんでした。私の理解では、ページで発生するすべてのイベントをリッスンするリスナーです。そうですか?ありがとう。

class OrderDetail(DetailView):
    model = Order

    def **dispatch**(self, request, *args, **kwargs):
        try:
            user_check_id = self.request.session.get("user_checkout_id")
            user_checkout = UserCheckout.objects.get(id=user_check_id)
        except UserCheckout.DoesNotExist:
            user_checkout = UserCheckout.objects.get(user=request.user)
        except:
            user_checkout = None

        obj = self.get_object()
        if obj.user == user_checkout and user_checkout is not None:
            return super(OrderDetail, self).dispatch(request, *args, **kwargs)
        else:
            raise Http404
16
Taylor Hardie

ディスパッチメソッドはリクエストを受け取り、最終的にレスポンスを返します。通常、getなどの別のメソッドを(IE dispatchingに)呼び出して応答を返します。要求と応答の間の仲介者と考えてください。

通常、クラス内のどのメソッド(たとえばget()post()など)を使用するか(IE dispatched)をHTTPメソッドに基づいて決定するだけです。リクエストで使用されました。何かのようなもの

def dispatch(self, request, *args, **kwargs):
    if request.method == 'GET':
        return self.get(*args, **kwargs)
    Elif request.method == 'POST':
        return self.post(*args, **kwargs)
    Elif #... and so on

独自のディスパッチメソッドを使用してこの動作を変更し、HTTP応答または「インターセプト」を返す必要があるメソッドを呼び出して、最終的にそれらのメソッドに到達する引数を変更できます。たとえば、これを使用して、特定の種類のリクエストをブロック/フィルタリングしたり、引数を挿入したりすることもできます...

def dispatch(self, request, *args, **kwargs):
    """Updates the keyword args to always have 'foo' with the value 'bar'"""
    if 'foo' in kwargs:
        # Block requests that attempt to provide their own foo value
        return HttpResponse(status_code=400)
    kwargs.update({'foo': 'bar'}) # inject the foo value
    # now process dispatch as it otherwise normally would
    return super().dispatch(request, *args, **kwargs)

しかし、重要な概念は、それが要求のエントリポイントであり、最終的に応答を返す責任があるということです。

28
sytech

リクエストURLがurls.pyファイルのURLと一致すると、Djangoはそのリクエストを指定したビューに渡します。リクエストは呼び出し可能な関数にのみ渡すことができます。ベースのビューでは、as_view()メソッドを使用しますas_view()メソッドは、呼び出し可能な関数を返します。

次に、この関数はビュークラスのインスタンスを作成し、dispatch()メソッドを呼び出します。次に、ディスパッチメソッドはリクエストを見て、ビュークラスのGETメソッドまたはPOSTメソッドがリクエストを処理する必要があるかどうかを決定します。

0
Richard Ackon