添加JSONParser后Swagger报错,如何让接口支持formdata与JSON?
解决方法
错误根源是drf-yasg不允许同一接口同时声明form类型参数和支持JSON请求体——添加JSONParser后,框架会默认接口可能接收JSON格式请求体,和手动配置的form参数产生冲突。要让接口同时支持multipart/form-data和application/json,按以下方式修改代码即可:
步骤1:定义两种请求格式的Schema
先分别定义表单格式和JSON格式对应的请求结构:
from drf_yasg import openapi from drf_yasg.utils import swagger_auto_schema # multipart/form-data对应的表单Schema form_request_schema = openapi.Schema( type=openapi.TYPE_OBJECT, required=['phone'], properties={ 'phone': openapi.Schema(type=openapi.TYPE_STRING, description="phone") } ) # application/json对应的JSON请求体Schema json_request_schema = openapi.Schema( type=openapi.TYPE_OBJECT, required=['phone'], properties={ 'phone': openapi.Schema(type=openapi.TYPE_STRING, description="phone") } )
步骤2:修改swagger_auto_schema配置
使用overrides_by_content_type参数,为两种Content-Type分别配置对应的请求体,替换原来的manual_parameters:
@swagger_auto_schema( operation_description='desc', overrides_by_content_type={ 'multipart/form-data': swagger_auto_schema( request_body=openapi.Schema( type=openapi.TYPE_OBJECT, required=['phone'], properties={ 'phone': openapi.Schema(type=openapi.TYPE_STRING, description="phone") }, schema_type='form' # 指定为表单类型 ) ), 'application/json': swagger_auto_schema( request_body=json_request_schema ) }, parser_classes=[MultiPartParser, FormParser, JSONParser] ) def post(self, request, *args, **kwargs): # 无需手动判断解析方式,DRF会自动处理 phone = request.data.get('phone') # 后续业务逻辑...
关键说明
overrides_by_content_type让Swagger针对不同Content-Type展示对应的请求结构,彻底避免参数冲突- DRF会根据请求的Content-Type自动调用对应解析器,直接从
request.data取参数即可,无需手动区分 - 保持
parser_classes配置不变,确保DRF能正确解析两种格式的请求
内容的提问来源于stack exchange,提问作者ohmywollie
相关产品推荐
相关产品推荐

