Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django中的dispatch用于什么?_Python_Django_Views_Dispatch - Fatal编程技术网

Python django中的dispatch用于什么?

Python django中的dispatch用于什么?,python,django,views,dispatch,Python,Django,Views,Dispatch,我一直在努力研究dispatch方法,特别是在Django中(请参见下面的代码示例)。然而,我似乎无法确切地理解它的作用。我试图从Django文档中获得理解,但没有发现他们提供了关于这个主题的信息。据我所知,它是一个侦听器,侦听页面上发生的所有事件,但我不确定是否是这种情况?谢谢 class OrderDetail(DetailView): model = Order def **dispatch**(self, request, *args, **kwargs):

我一直在努力研究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

dispatch方法接收请求并最终返回响应。通常,它通过调用(即调度到)另一个方法(如
get
)返回响应。把它看作是请求和响应之间的中间人

通常,它只是根据请求中使用的HTTP方法决定类中应该使用(即调度)的方法(例如
get()
post()
,等等)。差不多

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)

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

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


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

非常感谢您的解释。从现在起,这让我们的生活变得更加美好!AssertionError:。未在上设置已接受的\u呈现程序Response@AkshayHazari听起来你有一个完全与这个问题或答案无关的问题。尝试或问一个新问题。@sytech我是这样做的,请告诉我是否可以修改以使其更好-