我一直试图围绕调度方法,特别是在Django中(请参阅下面的代码示例)。但是,我似乎无法确切地知道它的作用。我试图从Django文档中获得一些理解,但没有找到他们提供有关该主题的信息。根据我的理解,它是一个监听器,可以监听页面上发生的所有事件,但我不确定是否是这种情况?感谢。
app.post('/login', passport.authenticate('login', {
successRedirect: '/#1',
failureRedirect: '/#2',
failureFlash: true
}));
app.post('/login',
passport.authenticate('login', {failureRedirect: '/login'}),
function (req, res) {
console.log("logged");
res.redirect('/#1');
});
答案 0 :(得分:22)
dispatch方法接收请求并最终返回响应。通常,它通过调用(IE 调度)另一种方法(如get
)来返回响应。将其视为请求和响应之间的中间人。
通常,它只是根据HTTP方法决定应该使用类中的哪个方法(例如get()
,post()
等)(IE dispatched )在请求中使用。像
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响应的任何方法,甚至可以“拦截”#39;并修改最终到达这些方法的参数。例如,您可以使用它来阻止/过滤某些类型的请求,甚至注入参数......
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)
但关键概念是,它是请求的切入点,并最终负责返回响应。
答案 1 :(得分:0)
当请求URL与urls.py文件中的URL匹配时,django将该请求传递到您指定的视图。该请求只能传递给可调用的函数。这就是为什么在使用基于类的视图时使用as_view()
方法的原因。 as_view()
方法返回可以调用的函数。
然后,此函数创建视图类的实例并调用其dispatch()
方法。然后,dispatch方法将查看请求并确定视图类的GET还是POST方法应处理该请求。