Django middleware

Django 提供了 middleware 来让你 hack Request 和 Response。用的时候有几个问题需要注意一下。

__call__ 方法

__call__ 方法实际上就是最早收到 request 的地方,如果不关心 view,那么就可以在这里做你想要做的事情。比如认证用户啥的。这个实际上应该就是早期的 process_request

process_view 方法

process_view 方法会接收到 view_func 和其参数,如果想要针对这些东西处理,可以在这里动作。比如我们所有 api 请求的 POST 的 body 里面都是固定格式的 json 数据,我就在这里检查了 json 的格式,并把解析结果给到了 view_func。

如果不打算对 view_func 做什么事情,那就最好做完想做的事情,直接返回 None 就可以。否则处理完毕之后,返回一个 response 对象。

要注意的是,这里最好不要产生 exception,产生了会把逻辑跑到 Middleware 的 exception 逻辑里面。所以最好对自己的代码段加上 try-except 逻辑。

另外,这里可以对 view_func 做调用,直接返回 view_func 的结果或者处理之后的结果,只要保证是个 response 对象就可以了。也可以不做调用,返回 None ,后续 django 也会调用。要注意的是,如果你对 view_func 做了调用,那么在捕捉到错误的时候,except 里面应该也需要返回一个 response 对象,不能返回 None 了,否则 djangon 还会再次调用这个 view_func 。

process_exception 方法

process_exception 方法是在 view 报错的情况下会调用。我在这里统一返回了 server error 的 json,http 状态是 200 的。