24

在我看来,上下文处理器可以做的所有事情,中间件都可以做。那么上下文处理器的意义何在?它们只是中间件精简版吗?

4

3 回答 3

33

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

阅读有关中间件的更多信息。

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

阅读有关上下文处理器的更多信息。

两者都相当容易编写并且有其目的。这是一个图表,显示了中间件和上下文在典型 django 流程中的位置:

在此处输入图像描述

Django 流程图

  1. 用户请求页面

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

  3. URL 使用 urls.py 确定相关视图

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

  5. 调用视图函数

  6. 视图可以选择通过模型访问数据

  7. 所有模型到数据库的交互都是通过管理器完成的

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

  9. 上下文被传递给模板进行渲染

于 2014-10-23T03:09:24.847 回答
18

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

于 2012-04-04T04:34:07.927 回答
1

它们针对不同的上下文在不同级别的堆栈中工作。通常很难让一个框架的堆栈保持绝对正统,尤其是像 Django 处理这样的 Web 框架唯一的事情就是请求和响应。是的,我们可以在渲染模板时使用 request.user,而不是 context.user by context_processor。但是您可能不希望在每个请求上都设置仅在模板中使用的属性。

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

于 2012-04-04T05:26:00.940 回答