在Django的“www.example.com“中的“MIDDLEWARE”中,在哪里设置自定义中间件的路径settings.py?

oiopk7p5  于 2023-06-25  发布在  Go
关注(0)|答案(1)|浏览(130)

我在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中,我应该在哪里设置自定义中间件的路径呢?

svmlkihl

svmlkihl1#

那么,在www.example.com的MIDDLEWARE中,我应该在哪里设置自定义中间件的路径settings.py?
这取决于您的中间件需要什么,以及在中间件之前和之后应该运行什么。实际上,假设你想打印request.user,那么:

def simple_middleware(get_response):
    print('Only once the server starts')

    def middleware(request):
        print(f'Before a view is called {request.user}')
        response = get_response(request)
        print('After a view is called')
        return response

    return middleware

而在视图中,如果你使用AuthenticationMiddleware,总是有一个request.user,如果你把它放在MIDDLEWARE设置的顶部,它将不会被设置。实际上,AuthenticationMiddleware设置了request.user,因此需要首先运行request.user。因此,我们必须将simple_middleware放在AuthenticationMiddleware之后。
对于许多中间件来说,最好将其放在列表的末尾,因为这样你就可以假设所有内置中间件都已经预处理了请求,因此已经在请求中设置了会话存储和.user。您的中间件也将是第一个退出的中间件,因此您不必检查是否产生了自定义错误页面。
Django文档中有一个名为 middleware ordering 的部分,简要解释了最常见的内置中间件以及它们如何相互依赖。例如,AuthenticationMiddleware[Django-doc]依赖于**SessionMiddleware**[Django-doc],因为登录用户的详细信息存储在会话变量中,因此AuthenticationMiddleware需要访问会话变量以确定哪个用户附加到请求。
确实,大多数提供中间件的Django相关包通常没有非常正确地记录它的位置。作为一般的经验法则,通常可以用途:

MIDDLEWARE = [
    # builtin middleware (django.middleware and django.contrib.*.middleware)
    # …,

    # django packages used
    # …,

    # your own custom middleware
    # …
]

当然也有例外。假设你设计了自己的会话变量机制,然后你可以用你的替换Django的内置,并且由于前面讨论的原因,它必须在AuthenticationMiddleware之前运行。那么,确切的顺序并不重要,只要满足文档中提到的约束,并且如果您构建在中间件之上(如request.user的示例),则可以确保中间件首先运行。

相关问题