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