上下文处理器与django中的中间件

时间:2012-04-04 04:31:03

标签: django django-templates django-middleware django-context

在我看来,上下文处理器可以做的一切,中间件都能做到。那么上下文处理器的意义何在?它们只是中间件 - 精简版吗?

3 个答案:

答案 0 :(得分:23)

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

详细了解Middleware

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

详细了解Context Processors

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

enter image description here

Django流程图

  1. 用户请求页面

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

  3. URLC使用urls.py

  4. 对相关的视图进行管理
  5. 查看中间件,可以操作或回答请求

  6. 调用视图功能

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

  8. 所有模型到数据库的交互都是通过经理

  9. 完成的
  10. 视图可以根据需要使用特殊上下文

  11. 将上下文传递给模板以进行渲染

答案 1 :(得分:14)

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

答案 2 :(得分:1)

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

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