代码之家  ›  专栏  ›  技术社区  ›  Taylor Hardie

django中的dispatch用于什么?

  •  31
  • Taylor Hardie  · 技术社区  · 7 年前

    我一直在努力研究分派方法,尤其是在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
    
    2 回复  |  直到 4 年前
        1
  •  56
  •   Sabito Greg    4 年前

    调度方法接收请求并最终返回响应。通常,它通过调用(即, 调度 to)另一种方法,如 get . 可以将其视为请求和响应之间的中间人。

    通常,它只是决定类中的方法(例如。 get() post() 等)应使用(即, 派遣 )基于请求中使用的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)
    

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

        2
  •  8
  •   Richard Ackon    6 年前

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

    然后,该函数创建view类的实例并调用其 dispatch() 方法dispatch方法然后查看请求,并决定view类的GET或POST方法是否应处理该请求。