【发布时间】:2018-07-30 11:37:59
【问题描述】:
假设我有以下类,受 Django 文档的启发:
class SimpleMiddleware(object): def __ init__(self, get_response): self.get_response = get_response def __call__(self, request): response = self.get_response(request) return response def process_view(self, request, view_func, view_args, view_kwargs): return None
在阅读 Daniel Rubio 的《Beginning Django》一书时,他解释说执行顺序是:
-
__ init __方法触发(在服务器启动时) -
__ call __方法触发(在每个请求上) - 如果声明,
process_view()方法被触发 - 查看方法以
self.get_response(request)开头的语句__ call __
“__ call __ 方法触发(在每个请求上)”究竟是什么意思?不会“触发”__ call __ 方法实际上会自动触发“self.get_respone(request)”,从而调用另一个中间件或类?
Django 文档指出:
process_view()在 Django 调用视图之前被调用。`
对我来说,这意味着 Django 检查 'SimpleMiddleware' 类的实例是否包含方法 'process_view()' 然后触发它,然后再调用 __ call __() 方法,该方法“调用视图” '?否则,如果立即触发__ call __方法,会不会因为__ call __方法调用视图(或下一个中间件)而错过'process_view()'?
有人可以帮我理解执行过程吗? Django 是怎么做的?
谢谢
【问题讨论】:
-
你读过the middleware documentation吗?那里解释得很好。
-
是的,它确实是一个很好的资源。我可以假设他们的语句 'process_view() 在 Django 调用视图之前被调用'意味着 process_view' 方法在 '__ call __' 之前运行吗?
标签: python django middleware