2012-04-04 327 views

回答

14

上下文处理器用于为模板提供额外的数据。中间件用于拦截请求/响应对象,并以某种有意义的方式修改它们(或触发其他行为)。

1

他们在不同的上下文中工作在不同的堆栈级别。它通常很难将框架堆栈保持为绝对正统,特别是像Django处理这样的Web框架是请求和响应。是的,我们可以在呈现模板时使用request.user,而不是context_processor使用context.user。但是您可能不希望仅在模板中使用的属性在每个请求中都设置。

此外,装饰器比视图级操作的中间件灵活,但很难说中间件是装饰者精简版。顺便说一下,我希望将上下文处理器作为分配模板标签对待,但会自动加载。

19

中间件充当Django的低级别请求/响应处理钩子,它很轻松。这些钩子可用于请求,响应,视图,template_response和异常处理。挂钩可能需要在视图处理它之前修改请求,它可能需要记录有关请求的信息以进行调试,检查cookie以设置本地等等。

了解更多关于Middleware

上下文处理器只是修改上下文。上下文是将变量传递给模板的关键值映射。上下文处理器将请求对象作为参数,并返回合并到上下文中的项目的字典。上下文会根据您的视图呈现给您的模板,并且它会附加您的上下文处理器合并的任何其他内容。您可以将其视为全局上下文变量,在您的所有模板中均可使用。

了解更多关于Context Processors

两者都相当简单的写和有其目的。下面是示出了其中中间件和上下文适应在典型的django流程的图:

enter image description here

Django的流程图

  1. 用户请求一个页面

  2. 请求到达请求中间件,它可以操纵或回答请求

  3. URLConffinds rela特德使用网址查看。PY

  4. 查看中间件被调用,它可以操纵或回答请求

  5. 视图功能是通过模型

  6. 所有模型来调用

  7. 视图可以选择性地访问数据-DB交互是通过管理器完成的

  8. 如果需要,视图可以使用特殊的上下文

  9. 将上下文传递给用于呈现的模板