what is the difference between decorator and middleware in Django.?

sanju saini
3 min readMay 14, 2023

--

In this article, We will discuss the difference between decorator and middleware in Django.

Both decorators and middlewares are used in Django to add additional functionality to the views or the application. However, they differ in the way they are implemented and the scope of their functionality.

A decorator is a function that takes another function as input and extends the behavior of the latter function without explicitly modifying it. In Django, decorators are often used to add authentication or permission checks to views.

Here's an example of a decorator in Django:

def rate_limited(func):
def wrapper(*args, **kwargs):
ip_address = request.remote_addr
key = f"ratelimit:{request.path}"
count = cache.get(key)
if count is None:
cache.set(key, 1, ex=RATE_PERIOD)
elif int(count) >= RATE_LIMIT:
return jsonify({"message": "Rate limit exceeded. Try again in 1 minute."}), 429
else:
# increment the request count and set the new TTL
cache.incr(key)
cache.expire(key, RATE_PERIOD)
# call the decorated function
return func(*args, **kwargs)
wrapper.__name__=func.__name__
return wrapper

in this example, we implement a rate-limited decorator, A rate-limited decorator is a Python function that wraps around another function, adding functionality to limit the rate at which the wrapped function can be called. The decorator checks whether the wrapped function has been called within a specified time interval and limits the number of times it can be called within that interval.

A middleware, on the other hand, is a component that sits between the client and the application and intercepts the request and response objects. In Django, middleware is often used to modify the behavior of the request or response, such as adding headers, modifying cookies, or logging requests.

Here’s an example of middleware in Django

from django.core.cache import cache
from django.http import JsonResponse

class RateLimitMiddleware:
def __init__(self, get_response):
self.get_response = get_response

def __call__(self, request):
# check if the request is rate-limited
if self.is_rate_limited(request):
return JsonResponse({"message": "Rate limit exceeded. Try again in 1 minute."}, status=429)

# call the view function
response = self.get_response(request)

return response

def is_rate_limited(self, request):
ip_address = request.META.get('REMOTE_ADDR')
key = f"ratelimit:{request.path}:{ip_address}"
count = cache.get(key)
if count is None:
cache.set(key, 1, timeout=RATE_PERIOD)
elif int(count) >= RATE_LIMIT:
return True
else:
# increment the request count and set the new TTL
cache.incr(key)
cache.expire(key, RATE_PERIOD)
return False

In this example, the RateLimitedMiddleware class takes the web framework app and max_per_second as parameters. The middleware checks whether the endpoint has been called within the minimum interval time and limits the number of times it can be called. If the endpoint has been called too many times, the middleware returns a "429 Too Many Requests" response. If the endpoint can be called, the middleware calls the web framework app. The middleware is called before each request to the endpoint, ensuring that the rate limit is enforced for each request.

Basic Difference between decorator and middleware.

Decorators in Django are functions that are used to modify the behavior of a view function. They are defined using the @decorator_name syntax and are placed before the view function in the code. Decorators are used to add extra functionality to views such as authentication, caching, or permission checking. A decorator can be applied to a specific view or to a group of views. Decorators work by wrapping the original view function with another function that provides additional functionality.

Middleware in Django is a series of hooks that are executed during the request-response processing cycle. Middleware is a set of components that sits between the web server and the view function. Middleware can modify the request or response object, perform logging, or perform other operations before and after the view function is executed. Middleware is applied to all views in the application and can be used to add functionality such as authentication, caching, or request/response processing.

In summary, decorators modify the behavior of a single view or a group of views, while middleware modifies the request or response objects for all views in the application.

--

--

sanju saini
sanju saini

Written by sanju saini

Senior Software Engineer with 4.5+ years of experience in full-stack development, specializing in Python, Golang, PHP, Django, FastAPI, React, and RESTful APIs.

No responses yet