python 29 lines · 1 tab

Django middleware for API versioning

Priya Sharma Jan 2026
1 tab
import re


class APIVersionMiddleware:
    """Extract API version from request and add to request object."""

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

    def __call__(self, request):
        # Try to extract from Accept header first
        accept = request.META.get('HTTP_ACCEPT', '')
        version_match = re.search(r'version=(\d+\.\d+)', accept)

        if version_match:
            request.api_version = version_match.group(1)
        elif request.path.startswith('/api/v'):
            # Extract from URL: /api/v2/...
            parts = request.path.split('/')
            if len(parts) > 2 and parts[2].startswith('v'):
                request.api_version = parts[2][1:]  # Remove 'v' prefix
            else:
                request.api_version = '1.0'  # Default
        else:
            request.api_version = '1.0'

        response = self.get_response(request)
        response['API-Version'] = request.api_version
        return response
1 file · python Explain with highlit

API versioning via middleware provides clean URL routing. I extract version from Accept header or URL prefix and set it on the request object. Views can check request.api_version to return appropriate responses. For breaking changes, I maintain separate serializer classes per version. Middleware is cleaner than versioning libraries for simple cases. I default to latest version for backwards compatibility. This pattern centralizes version logic and keeps view code focused on business logic. For complex APIs, DRF's built-in versioning is more feature-complete.


Related snips

Share this code

Here's the card — post it anywhere.

Django middleware for API versioning — share card
Link copied