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

Posted

技术标签:

【中文标题】django 中的上下文处理器与中间件【英文标题】:Context processors vs middleware in django 【发布时间】:2012-04-17 19:08:34 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

阅读更多关于Middleware。

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

阅读更多Context Processors。

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

Django 流程图

    用户请求页面

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

    URLConffinds 使用 urls.py 的相关 View

    调用视图中间件,可以操纵或响应请求

    视图函数被调用

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

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

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

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

【讨论】:

我喜欢那个流程图。但是有一个小缺陷:模型和模板之间的箭头应该在视图和模板之间。 它可能会通过views.py到模板,但在这种情况下数据来自models.py 当然,但是模型和模板之间没有直接联系(除非您使用模板标签访问模型,我认为这不是一个好主意) 不,它不是直接的,上下文是根据模型中的数据在视图中构建的。这是一个简化的高级流程,可帮助用户理解。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于django 中的上下文处理器与中间件的主要内容,如果未能解决你的问题,请参考以下文章

《Django框架从入门到实战》目录

《Django框架从入门到实战》目录

Django之 中间件

Django的请求生命周期与中间件中的5中方法

django之中间件

Django-中间件