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

Django pdb调试时drf-yasg Swagger UI上传文件获取为None

问题根因

后端获取不到上传文件是配置错误导致的,具体问题点:

  • 参数位置配置错误:代码中将invitation_file的参数位置设置为openapi.IN_QUERY,查询参数是URL后缀拼接的键值对,仅支持字符串传参,根本无法承载文件内容。文件上传参数必须放在请求表单中,对应枚举值为openapi.IN_FORM。
  • 缺少请求编码声明:文件上传接口必须显式声明接收multipart/form-data类型的请求,否则Swagger UI会默认使用普通表单或JSON编码发送请求,Django无法解析出请求中的文件段。
  • 代码冗余错误:视图类中重复定义了两次post方法和同名的invitation_file参数,后定义的方法会直接覆盖前序逻辑,属于无效代码,需要清理。另外类视图中写api_view = ['POST']是无效配置,api_view是函数视图专用的装饰器,类视图要通过类属性声明允许的请求方法。
修复后可运行代码
from rest_framework.views import APIView
from rest_framework.authentication import SessionAuthentication, TokenAuthentication
from drf_yasg import openapi
from drf_yasg.utils import swagger_auto_schema

# 响应结构定义保持原有逻辑即可
success_res_data = openapi.Schema(
    type=openapi.TYPE_OBJECT,
    properties={
        'status': openapi.Schema(type=openapi.TYPE_NUMBER, title='200'),
        'success': openapi.Schema(
            type=openapi.TYPE_OBJECT,
            properties={
                'message_header': openapi.Schema(type=openapi.TYPE_STRING),
                'message': openapi.Schema(type=openapi.TYPE_STRING)
            }
        )
    }
)
    
error_res_data = openapi.Schema(
    type=openapi.TYPE_OBJECT,
    properties={
        'status': openapi.Schema(type=openapi.TYPE_NUMBER, title='400'),
        'error': openapi.Schema(
            type=openapi.TYPE_OBJECT,
            properties={
                'message_header': openapi.Schema(type=openapi.TYPE_STRING),
                'message': openapi.Schema(type=openapi.TYPE_STRING)
            }
        )
    }
)

class TestView(APIView):
    http_method_names = ['post']
    authentication_classes = [SessionAuthentication, TokenAuthentication]

    @swagger_auto_schema(
        operation_description="description",
        manual_parameters=[
            openapi.Parameter(
                name='invitation_file',
                in_=openapi.IN_FORM,
                type=openapi.TYPE_FILE,
                required=True,
                description='上传的邀请文件'
            )
        ],
        # 必须加这行,指定文件上传的编码格式
        consumes=['multipart/form-data'],
        responses={200: success_res_data, 400: error_res_data}
    )
    def post(self, request):
        invitation_file = request.data.get('invitation_file', None)
        # 后续业务逻辑
        pass
注意事项
  • 修改代码后必须重启Django服务,强制刷新Swagger UI页面(清缓存),避免旧的接口配置缓存导致测试不生效
  • 正常拿到的invitation_file是Django的InMemoryUploadedFile/TemporaryUploadedFile对象,可以直接调用.read()、.name等属性获取文件内容和文件名
  • 如果项目配置了全局的默认解析器,要确保MultiPartParser在DRF的DEFAULT_PARSER_CLASSES配置中,否则即使请求格式正确也无法解析文件

内容的提问来源于stack exchange,提问作者Avin Mathew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 13:03:13