Technoarch Softwares - Middleware in Django

Middleware in Django

Django, renowned as a high-level Python web framework, offers a powerful middleware system that empowers developers to globally process requests and responses. Acting as a crucial intermediary, middleware seamlessly integrates custom logic into the request and response cycle. In this blog post, we'll delve into the nuances of Django middleware, uncovering its core purpose, built-in capabilities, and notably, the process of crafting custom middleware. We'll focus on creating middleware tailored for logging all requests, their response times, and response statuses.

Understanding Django Middleware

Django middleware operates during the request-response cycle, intercepting requests before they reach the view and responses before they leave the server. Middleware components are executed in the order they are defined in the MIDDLEWARE setting in your project’s file.

The middleware’s primary responsibilities include:

  1. Processing the Request: Middleware can manipulate the incoming request or take actions based on it.

  2. Processing the View: Middleware is invoked before the view is called, allowing for operations such as authentication checks or modifying the response.

  3. Processing the Response: Middleware can further modify the response generated by the view or take additional actions.


Anatomy of a Middleware Component:

A middleware component is a Python class with methods corresponding to different stages of the request-response cycle. The commonly used methods include:

  • __init__(self, get_response): Initialize the middleware instance, accepting a `get_response` function, which represents the next middleware or view in the chain.

  • __call__(self, request): Process the incoming request before it reaches the view. This method typically returns `get_response(request)`.

  • process_view(self, request, view_func, view_args, view_kwargs): Execute logic just before the view is called.

  • process_template_response(self, request, response): Modify the response after the view has been executed, specifically for template responses.

  • process_exception(self, request, exception): Handle exceptions raised during the processing of the request. This method is called when an exception occurs, allowing you to perform custom actions or provide alternative responses.

  • __del__(self): Cleanup actions, if necessary.

Creating Custom Middleware for Logging:

Now, let’s create a custom middleware to log all incoming requests, their response times, and response statuses. Create a new Python file, e.g.,, and define the following class:

Integrating Custom Middleware:

Add the fully-qualified path to your custom middleware class in the MIDDLEWARE setting in your file:

Now, every incoming request and its corresponding response details will be logged using the configured logger. Adjust the logging settings in your file as needed.


Django middleware provides a powerful way to extend the framework’s functionality. By creating custom middleware, such as the request logging middleware demonstrated above, developers can gain deeper insights into their application’s behavior and performance.


Leave a Comments

Your email address will not be published. Required fields are marked *