定制 Django 中间件的订购

Ordering of custom Django middleware

在 Django 应用程序中,我有两个中间件。

一个叫做NoWWWRedirectMiddleware,它的目的是重定向wwwno www

第二个叫做XForwardedForMiddleware。它用 HTTP_X_FORWARDED_FOR 的第一个值(如果存在)填充 REMOTE_ADDR

我的问题是关于 settings.py 中的中间件排序。目前,我是这样订购的:

'myproj.middleware.NoWWWRedirect.NoWWWRedirectMiddleware',
'myproj.middleware.XForwardedFor.XForwardedForMiddleware',
################## Other Middleware ###################
'user_sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',

我的问题是:前两个不应该反过来吗?我不清楚如何订购它们,目前正在凭直觉进行。

来自documentation

During the request phase, before calling the view, Django applies middleware in the order it’s defined in MIDDLEWARE, top-down.

所以看来您的顺序是正确的 - 如果用户要重定向到 no www,则设置远程地址变量没有任何意义。作为旁注 - 从 www 重定向到 no www 应该由网络服务器(Apache / Nginx)完成,这样会更有效率。