You already know the MIDDLEWARE setting, which contains the middlewares for your project. You can think of it as a low-level plugin system, allowing you to implement hooks that get executed in the request/response process. Each middleware is responsible for some specific action that will be executed for all HTTP requests or responses.
Avoid adding expensive processing to middlewares, since they are executed in every single request.
When an HTTP request is received, middlewares are executed in order of appearance in the MIDDLEWARE setting. When an HTTP response has been generated by Django, the response passes through all middlewares back in reverse order.
A middleware can be written as a function as follows:
def my_middleware(get_response):
def middleware(request):
# Code executed for each request before
# the view ...