在Django REST Framework中如何将同路径不同请求类型映射到不同视图?
实现方案
你完全可以实现同一路由根据不同请求方法映射到不同处理函数,这里提供两种符合你需求的常用实现方式:
方案1:轻量方法分发函数(无额外依赖,无需修改现有业务代码)
你不需要把业务逻辑揉在同一个函数里,只需要写一个无业务逻辑的纯分发函数,把不同请求方法对应到你已经写好的三个视图即可:
- 先修正你现有视图的小问题:
@api_view装饰器需要传入列表类型的请求方法参数,你当前写的@api_view('GET')会报错,调整为:
# 修正后的装饰器 @api_view(['GET']) def get_instrument_by_id(request:HttpRequest, id): # 原有业务逻辑不变 ... @api_view(['POST']) def update_instrument_by_id(request:HttpRequest, id): # 原有业务逻辑不变 ... @api_view(['DELETE']) def delete_instrument_by_id(request:HttpRequest, id): # 原有业务逻辑不变 ...
- 新增纯分发视图,不需要编写任何业务逻辑:
@api_view(['GET', 'POST', 'DELETE']) def instrument_id_dispatcher(request, id): # 仅做请求方法到对应处理函数的映射 method_map = { 'GET': get_instrument_by_id, 'POST': update_instrument_by_id, 'DELETE': delete_instrument_by_id } return method_map[request.method](request, id)
- 在你的
urls.py中绑定路由即可:
from django.urls import path from .views import instrument_id_dispatcher urlpatterns = [ # 其他路由... path('api/instrument/<int:id>/', instrument_id_dispatcher), ]
方案2:基于DRF类视图的实现(更符合DRF生态的规范写法)
如果你习惯用类视图,也可以用DRF的APIView做方法映射,不用修改现有业务函数:
from rest_framework.views import APIView class InstrumentByIdView(APIView): def get(self, request, id): return get_instrument_by_id(request, id) def post(self, request, id): return update_instrument_by_id(request, id) def delete(self, request, id): return delete_instrument_by_id(request, id)
路由绑定改为:
path('api/instrument/<int:id>/', InstrumentByIdView.as_view()),
额外说明
Django原生路由默认没有请求方法的匹配规则,是因为Django的FBV默认支持所有请求方法,需要通过require_http_methods装饰器或者DRF的@api_view装饰器做方法限制。两种方案都可以实现你要求的「业务逻辑拆分到不同函数,不用在单函数内做方法分支判断」的需求。
内容的提问来源于stack exchange,提问作者KZiovas
相关产品推荐
相关产品推荐

