在我看来,上下文处理器可以做的一切,中间件都能做到。那么上下文处理器的意义何在?它们只是中间件 - 精简版吗?
答案 0 :(得分:23)
中间件充当了Django在低级别的请求/响应处理的钩子,并且它很轻。钩子可用于请求,响应,视图,模板响应和异常处理。挂钩可能需要在视图处理之前修改请求,它可能需要记录有关请求的信息以进行调试,检查cookie以设置本地,等等。
详细了解Middleware。
上下文处理器只是修改上下文。 Context是传递给模板的变量的键值映射。上下文处理器将请求对象作为其参数,并返回合并到上下文中的项的字典。根据您的视图将上下文呈现给您的模板,并附加上下文处理器合并的任何其他内容。您可以将其视为全局上下文变量,可在所有模板中使用。
详细了解Context Processors。
两者都很容易编写并且有其目的。下面是一个图表,显示了典型django流中的中间件和上下文的位置:
Django流程图
用户请求页面
请求到达请求中间件,可以操纵或回复请求
URLC使用urls.py
查看中间件,可以操作或回答请求
调用视图功能
视图可以选择通过模型访问数据
所有模型到数据库的交互都是通过经理
视图可以根据需要使用特殊上下文
将上下文传递给模板以进行渲染
答案 1 :(得分:14)
上下文处理器用于为模板提供额外数据。中间件用于拦截请求/响应对象,并以某种有意义的方式修改它们(或触发其他行为)。
答案 2 :(得分:1)
它们针对不同的上下文在不同的堆栈级别工作。通常很难保持框架的堆栈绝对正统,尤其是像Django处理这样的Web框架是唯一的请求和响应。是的,我们可以在渲染模板时使用request.user,而不是context.processor的context.user。但是,您可能不希望在每个请求中设置仅在模板中使用的属性。
此外,装饰器比视图级别操作的中间件更灵活,但很难说中间件是装饰精简版。我想将上下文处理器视为分配模板标记,但顺便说一下,它会自动加载。