Python django中的dispatch用于什么?
我一直在努力研究dispatch方法,特别是在Django中(请参见下面的代码示例)。然而,我似乎无法确切地理解它的作用。我试图从Django文档中获得理解,但没有发现他们提供了关于这个主题的信息。据我所知,它是一个侦听器,侦听页面上发生的所有事件,但我不确定是否是这种情况?谢谢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):
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我是这样做的,请告诉我是否可以修改以使其更好-