【django】多版本路由实现

 1. 使用URL命名空间

# urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
 
# 导入你的视图集
from .views import V1ViewSet, V2ViewSet
 
# 创建路由器实例
router_v1 = DefaultRouter()
router_v1.register(r'items', V1ViewSet)
 
router_v2 = DefaultRouter()
router_v2.register(r'items', V2ViewSet)
 
# 使用命名空间区分版本
urlpatterns = [
    path('api/v1/', include((router_v1.urls, 'v1'), namespace='v1')),
    path('api/v2/', include((router_v2.urls, 'v2'), namespace='v2')),
]

 

2、使用视图集和路由装饰器

# views.py
from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from functools import wraps
 
def api_version(version):
    def decorator(view_func):
        @wraps(view_func)
        def _wrapped_view(self, *args, **kwargs):
            if self.request.version != version:
                return Response({'error': 'Version not supported'}, status=400)
            return view_func(self, *args, **kwargs)
        return _wrapped_view
    return decorator
 
class BaseViewSet(viewsets.ModelViewSet):
    permission_classes = [IsAuthenticated]
    http_method_names = ['get', 'post', 'put', 'patch', 'delete']

使用装饰器

class V1ViewSet(BaseViewSet):
    @api_version('v1')
    def list(self, request, *args, **kwargs):
        # 你的逻辑代码...
        return Response({'version': 'v1'})
    
    @api_version('v1')
    def create(self, request, *args, **kwargs):
        # 你的逻辑代码...
        return Response({'version': 'v1'})
        
class V2ViewSet(BaseViewSet):
    @api_version('v2')
    def list(self, request, *args, **kwargs):
        # 你的逻辑代码...
        return Response({'version': 'v2'})
    
    @api_version('v2')
    def create(self, request, *args, **kwargs):
        # 你的逻辑代码...
        return Response({'version': 'v2'})

 

 

3、使用自定义中间件检查版本头或查询参数

# middleware.py
class ApiVersionMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        # One-time configuration and initialization.
    def __call__(self, request):
        # Code to be executed for each request before the view (and later middleware) are called.
        request.version = request.headers.get('X-API-Version', request.GET.get('version', 'default'))  # 从头部或查询参数获取版本信息
        response = self.get_response(request)  # 这里调用下一个中间件或视图函数等。
        # Code to be executed for each request/response after the view is called.
        return response  # 返回响应。

在settings中添加配置

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',  # 其它中间件...  'yourapp.middleware.ApiVersionMiddleware',  # 添加自定义中间件到列表

 

 

 

参考链接

Django多版本路由控制实战指南:两种主流方案深度解析_django url的版本管理-CSDN博客

posted @ 2025-07-09 11:23  代码诠释的世界  阅读(9)  评论(0)    收藏  举报