Custom middleware allows executing logic before and after a request is processed by the view. Middleware can modify requests, responses, or handle exceptions globally.
A middleware class must implement __init__()
and __call__()
. Additional hooks like process_view()
, process_exception()
, and process_template_response()
can be included.
class CustomMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
print("Before view")
response = self.get_response(request)
print("After view")
return response
__init__()
stores the get_response
function.__call__()
executes logic before and after the request is processed.The process_view()
method runs before the view is called.
class BlockUserMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def process_view(self, request, view_func, view_args, view_kwargs):
if request.user.is_authenticated and request.user.username == "blocked_user":
return HttpResponse("Access Denied", status=403)
process_view()
inspects the request before reaching the view.HttpResponse
prevents the view from executing.The process_exception()
method catches exceptions raised in views.
class ExceptionHandlerMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def process_exception(self, request, exception):
return HttpResponse(f"Error: {str(exception)}", status=500)
process_exception()
handles exceptions and returns a custom response.The process_template_response()
method runs after the view returns a TemplateResponse
.
class AddContextMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def process_template_response(self, request, response):
response.context_data['extra'] = 'Extra Context Data'
return response
process_template_response()
modifies the response’s context data before rendering.To enable custom middleware, add it to MIDDLEWARE
in settings.py
.
MIDDLEWARE = [
'myapp.middleware.CustomMiddleware',
'myapp.middleware.BlockUserMiddleware',
]
MIDDLEWARE
affects execution.Custom middleware provides a flexible way to modify request processing globally.