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 方法是否应该处理请求。
我一直在努力研究调度方法,尤其是在 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 方法是否应该处理请求。