我在the doc之后在middleware/sample.py
中创建了中间件simple_middleware()
,如下所示。* 我正在学习中间件:
django-project
|-core
| └-settings.py
|-middleware
| |-__init__.py
| └-sample.py # Here
|-app1
└-app2
# "middleware/sample.py
def simple_middleware(get_response):
print("Only once the server starts")
def middleware(request):
print("Before a view is called")
response = get_response(request)
print("After a view is called")
return response
return middleware
但是,我不知道在settings.py
中的MIDDLEWARE中在哪里设置自定义中间件的路径,如下所示。MIDDLEWARE
中的第一个、最后一个或任何位置?:
# "core/settings.py"
MIDDLEWARE = [
# "middleware.sample.simple_middleware" # The 1st?
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
# "middleware.sample.simple_middleware" # Anywhere?
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
# "middleware.sample.simple_middleware" # The last?
]
实际上,我知道文档在下面的激活中间件中说,但我想知道在哪里设置它:
MIDDLEWARE中的顺序很重要,因为中间件可以依赖于其他中间件。
那么,在settings.py
中的MIDDLEWARE
中,我应该在哪里设置自定义中间件的路径呢?
1条答案
按热度按时间svmlkihl1#
那么,在www.example.com的MIDDLEWARE中,我应该在哪里设置自定义中间件的路径settings.py?
这取决于您的中间件需要什么,以及在中间件之前和之后应该运行什么。实际上,假设你想打印
request.user
,那么:而在视图中,如果你使用
AuthenticationMiddleware
,总是有一个request.user
,如果你把它放在MIDDLEWARE
设置的顶部,它将不会被设置。实际上,AuthenticationMiddleware
设置了request.user
,因此需要首先运行request.user
。因此,我们必须将simple_middleware
放在AuthenticationMiddleware
之后。对于许多中间件来说,最好将其放在列表的末尾,因为这样你就可以假设所有内置中间件都已经预处理了请求,因此已经在请求中设置了会话存储和
.user
。您的中间件也将是第一个退出的中间件,因此您不必检查是否产生了自定义错误页面。Django文档中有一个名为 middleware ordering 的部分,简要解释了最常见的内置中间件以及它们如何相互依赖。例如,
AuthenticationMiddleware
[Django-doc]依赖于**SessionMiddleware
**[Django-doc],因为登录用户的详细信息存储在会话变量中,因此AuthenticationMiddleware
需要访问会话变量以确定哪个用户附加到请求。确实,大多数提供中间件的Django相关包通常没有非常正确地记录它的位置。作为一般的经验法则,通常可以用途:
当然也有例外。假设你设计了自己的会话变量机制,然后你可以用你的替换Django的内置,并且由于前面讨论的原因,它必须在
AuthenticationMiddleware
之前运行。那么,确切的顺序并不重要,只要满足文档中提到的约束,并且如果您构建在中间件之上(如request.user
的示例),则可以确保中间件首先运行。