I was wondering in what order the code would be executed if I specified multiple Middleware in Django, so I tried it.
settings.py Excerpt from the configuration file
MIDDLEWARE = (
#・ ・ ・ ・ Various Middleware,
"middleware.Middleware1",
"middleware.Middleware2",
)
middleware.py Define two 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 Textile View
from django.http import HttpResponse
from django.views import View
class Hoge(View):
def get(self, request):
print("View")
return HttpResponse()
The result of requesting the endpoint corresponding to Hoge View
M1 before
M2 before
View
M2 after
M1 after
--__call__
is executed in a nested manner in the order of Middleware defined in the configuration file.
--View code is executed only once in the middle of nesting.
After writing, I noticed [this 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) also had the following description showing the same fact.
Also, when the request is sent, Middleware will execute the process described in (2) in order from the top of the settings in this settings.py. On the other hand, the processes described in (3) are executed in the reverse order. Therefore, in some cases, it is necessary to be aware of this order when setting.
(I understand how it's nested, so it's okay ...)
Recommended Posts