django中间件process_request和process_view之间的区别

时间:2015-10-29 06:23:16

标签: django middleware

我对process_requestprocess_view感到有些困惑。

进程请求是您希望通过请求传递视图的内容。示例可以从request.user获取。

然后process_view做了什么?最初是为了执行任何视图而不是调用任何URL吗?像最初我想显示主页视图,但这也可以通过网址完成。

有人可以举例说明何时使用process_view

谢谢

2 个答案:

答案 0 :(得分:16)

在Django确定哪个视图应该处理请求之前调用

process_request(因此,它唯一的参数是request)。

在Django确定哪个视图将处理请求之后但在调用该视图之前调用

process_view。它将有权访问request对象,以及将处理它的视图以及将传递给该视图的参数。

每当您需要知道将用于请求的视图时,您都可以使用process_view。一个很好的例子就是Django's CSRF Middleware process_view,如果请求所针对的视图中存在csrf_exempt装饰器,它将不会强制实施CSRF保护:

def process_view(self, request, callback, callback_args, callback_kwargs):
    [...]

    if getattr(callback, 'csrf_exempt', False):
       return None

    [...]

答案 1 :(得分:2)

Adrian Ghiuta写了一个非常好的答案。我只是想补充几点。

在进行网址匹配之前调用

process_request,并在网址匹配之后但在调用该视图之前调用process_view

我们可以使用process_request更改网址本身,从而调用不同的视图。这一点帮助我理解了这些,所以我想回答它,也许它也是其他人。