Django Tutorial
Django Create A Complete Project
Django Template
Django Database Query
Django Form
Django Authentication and Permission Management
Django unittest
Django Advanced
In this tutorial, we will discuss Django middleware, its purpose, and how to create custom middleware.
Middleware is a series of hooks that process requests and responses globally in a Django application. It allows you to process requests before they reach views, and responses before they are returned to the user. Middleware is useful for tasks like authentication, session management, and cross-origin resource sharing (CORS) management.
Django comes with several built-in middleware classes that can be used out-of-the-box:
django.middleware.security.SecurityMiddleware
: Implements various security enhancements.django.contrib.sessions.middleware.SessionMiddleware
: Manages sessions.django.middleware.common.CommonMiddleware
: Provides various useful features such as appending slashes to URLs and handling conditional GET requests.django.middleware.csrf.CsrfViewMiddleware
: Implements CSRF protection for Django applications.django.contrib.auth.middleware.AuthenticationMiddleware
: Associates users with requests using sessions.django.contrib.messages.middleware.MessageMiddleware
: Handles messages between requests.django.middleware.clickjacking.XContentOptionsMiddleware
: Provides protection against clickjacking.To create custom middleware, you need to create a Python class with one or both of the following methods:
__init__(self, get_response)
: The constructor method that takes a get_response
callable, which is used to call the next middleware or view in the chain.__call__(self, request)
: This method processes the request, calling the next middleware or view in the chain using the get_response
callable, and processes the response before returning it.Here's an example of a custom middleware that measures the time taken to process a request:
import time from django.http import HttpResponseForbidden class TimingMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): start_time = time.time() response = self.get_response(request) end_time = time.time() response['X-Elapsed-Time'] = str(end_time - start_time) return response
In this example, the TimingMiddleware
measures the time taken to process a request and adds an X-Elapsed-Time
header to the response.
To add your custom middleware to the project, include it in the MIDDLEWARE
setting in your project's settings.py
file:
MIDDLEWARE = [ # ... 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XContentOptionsMiddleware', # Add your custom middleware 'myapp.middleware.TimingMiddleware', ]
In this example, the TimingMiddleware
is added after Django's built-in middleware.
That's it! In this tutorial, we've covered what Django middleware is, the built-in middleware classes provided by Django, how to create custom middleware, and how to add it to a Django project. Custom middleware can be a powerful way to globally process requests and responses in your Django applications.
Creating custom middleware in Django:
class CustomMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): # Custom logic before the view is called response = self.get_response(request) # Custom logic after the view is called return response
Django middleware order and execution:
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', # Add your custom middleware here 'myapp.middleware.CustomMiddleware', 'django.middleware.common.CommonMiddleware', ]
Configuring middleware in Django settings:
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'myapp.middleware.CustomMiddleware', # ... ]
Adding authentication middleware in Django:
MIDDLEWARE = [ 'django.contrib.auth.middleware.AuthenticationMiddleware', # ... ]
Django middleware for handling CORS:
MIDDLEWARE = [ 'corsheaders.middleware.CorsMiddleware', # ... ]
Error handling middleware in Django:
MIDDLEWARE = [ 'django.middleware.common.CommonMiddleware', 'myapp.middleware.ErrorHandlingMiddleware', # ... ]
Middleware for handling security in Django:
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', # ... ]
Django middleware for content compression:
MIDDLEWARE = [ 'django.middleware.gzip.GZipMiddleware', # ... ]
Middleware for handling sessions in Django:
MIDDLEWARE = [ 'django.contrib.sessions.middleware.SessionMiddleware', # ... ]