Django中间件的正确排序是什么?

 希臘神話2502873813 发布于 2022-12-12 17:04

这个页面:https://docs.djangoproject.com/en/1.7/ref/middleware/#middleware-ordering有/暗示以下排序(问题1:我是否正确假设列表的顺序正确?)

    UpdateCacheMiddleware

    GZipMiddlewaree

    ConditionalGetMiddleware

    SessionMiddleware

    LocaleMiddleware

    CommonMiddleware

    CsrfViewMiddleware

    AuthenticationMiddleware

    MessageMiddleware

    FetchFromCacheMiddleware

    FlatpageFallbackMiddleware

    RedirectFallbackMiddleware

虽然https://docs.djangoproject.com/en/dev/topics/http/middleware/#hooks-and-application-order上的图形似乎表明CommonMiddleware应该在SessionMiddleware之前:

在Django 1.5 django-admin.py startproject生成(https://docs.djangoproject.com/en/1.5/topics/http/middleware/#hooks-and-application-order)

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)

而以1.6开头的版本生成(https://docs.djangoproject.com/en/1.6/topics/http/middleware/#hooks-and-application-order)

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

问题2:我应该更改1.5项目中的顺序,以便SessionMiddleware在CommonMiddleware之前吗?

问题3:切换订单时如何处理不同的请求?

1 个回答
  • 仅供参考,您可能有兴趣阅读Django 1.7 Middleware Ordering.它解释了中间件订购的后果,我认为它仍然适用于以前的Django版本.

    中间件排序以下是关于各种Django中间件类的排序的一些提示:

    UpdateCacheMiddleware

    在那些修改Vary头之前(SessionMiddleware,GZipMiddleware,LocaleMiddleware).

    GZipMiddleware

    在任何可能改变或使用响应主体的中间件之前.

    UpdateCacheMiddleware之后:修改Vary标头.

    ConditionalGetMiddleware

    在CommonMiddleware之前:当USE_ETAGS = True时使用其Etag标头.

    SessionMiddleware

    UpdateCacheMiddleware之后:修改Vary标头.

    LocaleMiddleware

    SessionMiddleware(使用会话数据)和CacheMiddleware(修改Vary头)之后的最顶端之一.

    CommonMiddleware

    在任何可能改变响应的中间件之前(它计算ETag).

    在GZipMiddleware之后,它不会在gzip压缩内容上计算ETag标头.

    靠近顶部:当APPEND_SLASH或PREPEND_WWW设置为True时,它会重定向.

    更新(如评论中的OP所指)

    相关更改似乎默认情况下启用了区域设置中间件.

    在该提交的评论中:

    + .. versionchanged :: 1.6 +在以前的版本中,LocaleMiddleware` wasn't enabled by default. + +Because middleware order matters, you should follow these guidelines: * Make sure it's one of the first middlewares installed. * It should come afterSessionMiddleware , becauseLocaleMiddleware makes use of session data. And it should come beforeCommonMiddleware becauseCommonMiddleware needs an activated language in order to resolve the requested URL. * If you useCacheMiddleware , putLocaleMiddleware``之后.

    因此,实际上,排序的新变化是默认情况下解决启用LocaleMiddleWare的问题.您不需要在以前Django的版本中更改这些订单,因为默认情况下不启用它们.

    更新

    LocaleMiddleware已经从项目模板中删除

    2022-12-12 17:06 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有