上下文处理器往每个模板里塞变量。它们什么时候运行?模板没用到也运行吗?开销多大?这篇给处理器打日志,把运行时机与次数数出来。
render(request, "page.html") → a=B 覆盖了 A b=B 处理器调用: ['cp_a', 'cp_b'] render_to_string(无 request) → 'a= b=' 处理器调用: [] render_to_string(request=req) → a=B 覆盖了 A b=B 处理器调用: ['cp_a', 'cp_b']
邮件模板常用 render_to_string 且不带 request,这时处理器变量(比如 user)都拿不到。
模板里没用任何变量,处理器仍被调用: ['cp_a', 'cp_b'] 模板里 include 了 2 次,处理器调用次数: 2 (一次渲染只跑一遍) 连续渲染 3 次: 6 次调用(每次渲染各一次)
所以不要在处理器里做重活(数据库查询、远程调用),或者做成惰性(返回 lazy 对象/函数,模板真的用到时才执行)——惰性做法本文没有测。
cp_a 然后 cp_b: a=B 覆盖了 A b=B 调用顺序: ['cp_a', 'cp_b'] render 里显式传 a="视图里的 a": a=视图里的 a b=B
变量名冲突时:后面的处理器覆盖前面的,视图传的 context 最高。
没有额外处理器:每次渲染中位 0.010 ms;加一个 5 ms 的处理器:6.410 ms
本实验的处理器是 time.sleep(0.005) 的人工延迟,只为说明「每次渲染都付」。
默认配置(本项目模板设置)里的 context_processors: ['context_processors.csrf', 'context_processors.request', 'cps.cp_a', 'cps.cp_b']
项目里要用 request.user 就要启用 auth 处理器,要用 messages 同理。