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

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

【问题讨论】:

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


    【解决方案1】:

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

    阅读更多关于Middleware

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

    阅读更多Context Processors

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

    Django 流程图

    1. 用户请求页面

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

    3. URLConffinds 使用 urls.py 的相关 View

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

    5. 视图函数被调用

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

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

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

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

    【讨论】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2013-02-06
        • 2011-07-08
        • 1970-01-01
        • 2016-07-01
        • 1970-01-01
        • 2018-02-04
        • 1970-01-01
        • 2020-04-12
        • 2011-08-19
        相关资源
        最近更新 更多