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
相关产品推荐
相关产品推荐

