Code-Memo

Custom Middleware

Custom middleware allows executing logic before and after a request is processed by the view. Middleware can modify requests, responses, or handle exceptions globally.

Structure of a Custom Middleware

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
Using process_view() to Modify Views

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)
Handling Exceptions with process_exception()

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)
Modifying Template Responses with process_template_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
Activating Custom Middleware

To enable custom middleware, add it to MIDDLEWARE in settings.py.

MIDDLEWARE = [
    'myapp.middleware.CustomMiddleware',
    'myapp.middleware.BlockUserMiddleware',
]

Custom middleware provides a flexible way to modify request processing globally.