You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 22:57:21