New middleware format in Django 2

MIddleware (middleware) are used to modify an incoming request object into a view or to modify a response object returned from a view. They allow us to modify requests/responses globally.

Old format middleware

Before Django 1.10, there were 5 hooks. Any class that had process_request(), process_view(), process_exception(), process_template_response() and process_response() methods could be used as middleware and specified in the settings.py setting in the  MIDDLEWARE_CLASSES parameter.

The first two calls to — process_request() and process_view() were called before the view was called. The following three methods process_exception(), process_template_response() and process_response() were executed after the view returned a response object.

New middleware format

The most important change when migrating a project to Django 2 — this change MIDDLEWARE_CLASSES to MIDDLEWARE in the settings.py file and MIDDLEWARE_CLASSES is removed.

The old middlewares must be a class, while the new ones can be any callables that receive get_response or, when responded, accept a request and return a response.

class TimeStampMiddleware(object):
     def __init__(self, get_response):
         self.get_response = get_response

     def __call__(self, request):
         request.timestamp = datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S')
         response = self.get_response(request)
         return response

Here, get_response can be a view that returns a response, or the next middleware in the list. Therefore, the request is processed in the specified order by the middleware, and the response is processed in the reverse order.

To activate your middleware, you need to add the path to it in MIDDLEWARE in the settings.py file:

MIDDLEWARE = [
     '...',
     'my_app.middleware.TimeStampMiddleware',
     '...',
]

Update middleware

Django provides a mixin django.utils.deprecation.MiddlewareMixin which should extend the capabilities of the old middleware format. Thus MiddlewareMixin converts the class object into a callable. For example:

from django.utils.deprecation import MiddlewareMixin

class CustomMiddleware(MiddlewareMixin):
     def process_request(self, request):
         # Process the request
         pass

     def process_response(self, request, response):
         # Process the response
         return response

 

Back to Top