Middleware order matters: Django runs them in the order listed in MIDDLEWARE settings.
Middleware can modify both request and response objects.
Use middleware for cross-cutting concerns like logging, security, and headers.
Summary
Middleware runs code before and after views to handle requests and responses.
Define middleware as a class with __init__ and __call__ methods.
Middleware helps add features like logging, headers, and security checks easily.
Practice
(1/5)
1. What is the main purpose of middleware in Django's request/response flow?
easy
A. To directly render HTML templates
B. To run code before and after the view processes a request
C. To manage database migrations
D. To handle user authentication only
Solution
Step 1: Understand middleware role
Middleware runs code before and after views to modify requests or responses.
Step 2: Compare options
Only To run code before and after the view processes a request describes this behavior; others describe unrelated tasks.
Final Answer:
To run code before and after the view processes a request -> Option B
Quick Check:
Middleware = pre/post view code [OK]
Hint: Middleware wraps views to add pre/post processing [OK]
Common Mistakes:
Confusing middleware with template rendering
Thinking middleware manages database directly
Assuming middleware only handles authentication
2. Which of the following is the correct minimal structure of a Django middleware class?
easy
A. def my_middleware(get_response):
def middleware(request):
return get_response(request)
return middleware
B. class MyMiddleware:
def process_request(self, request):
pass
C. class MyMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
return response
D. class MyMiddleware:
def handle(self, request):
return request
Solution
Step 1: Recall Django middleware class pattern
Middleware must have __init__ with get_response and __call__ with request.
Step 2: Match options to pattern
Only class MyMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
return response matches this exact structure; others miss __call__ or use wrong methods.
Final Answer:
Class with __init__ and __call__ methods -> Option C
Quick Check:
Middleware class = __init__ + __call__ [OK]
Hint: Middleware class needs __init__ and __call__ methods [OK]
Common Mistakes:
Using process_request instead of __call__
Defining middleware as a simple function without class
Missing get_response parameter in __init__
3. Given this middleware code, what will be printed when a request is processed?
class LogMiddleware:
def __init__(self, get_response):
self.get_response = get_response
print('Init called')
def __call__(self, request):
print('Before view')
response = self.get_response(request)
print('After view')
return response
# Assume this middleware is active and a request comes in
medium
A. Init called\nBefore view\nAfter view
B. Before view\nAfter view\nInit called
C. After view\nBefore view\nInit called
D. Init called only
Solution
Step 1: Understand middleware instantiation
__init__ runs once when server starts, printing 'Init called'.
Step 2: Trace __call__ during request
On request, prints 'Before view', calls view, then prints 'After view'.
Final Answer:
Init called\nBefore view\nAfter view -> Option A
Quick Check:
Init once, then before/after view prints [OK]
Hint: Init prints once; __call__ prints before and after view [OK]
Common Mistakes:
Thinking __init__ runs on every request
Mixing order of prints
Ignoring that __call__ wraps the view call
4. Identify the error in this middleware code snippet: