什么是django使用的派遣?

Tay*_*die 18 python django views dispatch

我一直试图围绕调度方法,特别是在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
Run Code Online (Sandbox Code Playgroud)

syt*_*ech 31

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

通常,它只是根据请求中使用的HTTP方法决定应该使用类(例如get(),post()等)中的哪个方法(IE 调度).就像是

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
Run Code Online (Sandbox Code Playgroud)

您可以使用自己的调度方法来更改此行为,以调用您应该返回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)
Run Code Online (Sandbox Code Playgroud)

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


Ric*_*kon 15

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

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