【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', # 添加自定义中间件到列表
参考链接