[PYTHON] Ordre d'exécution de Django Middleware

Je me demandais dans quel ordre le code serait exécuté si plusieurs middlewares étaient spécifiés dans Django, alors je l'ai essayé.

Code expérimental

settings.py Extrait du fichier de configuration

MIDDLEWARE = (
    #・ ・ ・ ・ Divers middleware,
    "middleware.Middleware1",
    "middleware.Middleware2",
)

middleware.py Définir deux middleware

class Middleware1:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        print("M1 before")
        response = self.get_response(request)
        print("M1 after")

        return response


class Middleware2:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        print("M2 before")
        response = self.get_response(request)
        print("M2 after")

        return response

hoge.py Vue textile

from django.http import HttpResponse
from django.views import View


class Hoge(View):
    def get(self, request):
        print("View")
        return HttpResponse()

Résultat expérimental

Le résultat de la demande du point final correspondant à Hoge View

M1 before
M2 before
View
M2 after
M1 after

--__call__ est exécuté de manière imbriquée dans l'ordre du middleware défini dans le fichier de configuration.

Après avoir écrit, j'ai remarqué [cet article](https://qiita.com/shirakiya/items/1503eaffe81f91af5b9d#middleware%E3%82%92%E5%88%A9%E7%94%A8%E3% 81% 99% E3% 82% 8B% E8% A8% AD% E5% AE% 9A% E3% 82% 92% E8% BF% BD% E5% 8A% A0% E3% 81% 99% E3% 82% 8B) avait également la description suivante montrant le même fait.

De plus, lorsqu'une requête est envoyée, Middleware exécutera le processus décrit dans (2) dans l'ordre à partir du haut de ce qui est défini dans ce settings.py. D'autre part, les processus décrits en (3) sont exécutés dans l'ordre inverse. Par conséquent, dans certains cas, il est nécessaire de tenir compte de cet ordre lors du paramétrage.

(Je comprends comment c'est imbriqué, donc ça va ...)

Recommended Posts

Ordre d'exécution de Django Middleware
Créez votre propre middleware Django
Django
(Remarque) Ordre de recherche des fichiers modèles dans Django
Construction du serveur d'exécution Python (Python + uWSGI + Django + Nginx)
Django: tester un middleware qui dépend d'un autre middleware