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 方法是否应该处理该请求。
| 归档时间: |
|
| 查看次数: |
7737 次 |
| 最近记录: |