什么是django使用的派遣?

时间:2017-12-14 08:12:05

标签: python django views dispatch

我一直试图围绕调度方法,特别是在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');
    });

2 个答案:

答案 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方法应处理该请求。