django 中的 dispatch 是做什么用的?

What is dispatch used for in django?

我一直在努力研究调度方法,尤其是在 Django 中。但是,我似乎无法弄清楚它到底做了什么。我试图从 Django 文档中获得理解,但没有找到关于这个主题的信息。根据我的理解,它是一个侦听页面上发生的所有事件的侦听器,但我不确定是否是这种情况?

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

调度方法接收请求并最终 return 响应。通常,它 return 通过调用(即 调度 到)另一个方法 get 来响应。将其视为请求和响应之间的中间人。

通常,它只是决定应该使用 class 中的什么方法(例如 get()post() 等)(即 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

您可以使用自己的分派方法来更改此行为,以调用您想要的任何方法,应该 return HTTP 响应甚至 'intercept' 并修改最终到达这些方法的参数。例如,您可以使用它来 block/filter 某些类型的请求甚至注入参数...

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)

但关键概念是它是请求的入口点,并最终负责 return 响应。

当请求 url 与您的 urls.py 文件中的 url 匹配时,django 将该请求传递给您指定的视图。请求只能传递给可调用函数。这就是为什么在使用基于 class 的视图时,您使用 as_view() 方法。 as_view()方法returns一个可以调用的函数。

此函数然后创建视图的一个实例 class 并调用它的 dispatch() 方法。调度方法然后查看请求并决定视图 class 的 GET 或 POST 方法是否应该处理请求。