如何在Flask(Python)单API中解析文件与JSON请求
同时接收文件与字符串参数的Flask-RESTPlus API问题解决
问题根源
当通过multipart/form-data上传文件时,请求的Content-Type并非application/json,因此Flask不会将请求体解析为JSON对象,request.json自然为空。同时你原代码存在DTO定义混乱(变量未定义、字段名不匹配)的问题,进一步导致参数解析失败。
正确解决方案(推荐)
文件上传请求默认使用multipart/form-data格式,应将字符串参数作为表单字段一同传递,用reqparse统一解析文件与表单参数,无需分开操作request.files和request.json。
1. 修正DTO定义
from flask_restplus import reqparse, Namespace from werkzeug.datastructures import FileStorage api = Namespace('user', description='user operations') class FilesUploadDto: # 创建统一的解析器,同时处理文件和表单参数 upload_parser = reqparse.RequestParser() # 添加文件参数 upload_parser.add_argument('myfile1', location='files', type=FileStorage, required=True, help='First file') upload_parser.add_argument('myfile2', location='files', type=FileStorage, required=True, help='Second file') # 添加字符串参数(默认location为form,可省略) upload_parser.add_argument('username', type=str, required=True, help='Username')
注:修复了原代码中file_upload未定义、变量重复赋值、字段名不匹配的问题。
2. 修正控制器代码
from flask_restplus import Resource from your_dto_module import FilesUploadDto, api @api.route('/my_file_upload') class UploadMyFile(Resource): @api.doc("Upload my file") @api.expect(FilesUploadDto.upload_parser, validate=True) def post(self): # 一次性解析所有参数 args = FilesUploadDto.upload_parser.parse_args() user_name = args['username'] my_file1 = args['myfile1'] my_file2 = args['myfile2'] return some_function(user_name, my_file1, my_file2)
通过parse_args()统一获取文件与字符串参数,自动完成校验,无需直接操作request对象的属性。
补充说明
request.files仅存储上传的文件对象,字符串表单参数需从request.form获取,但使用reqparse统一解析更符合RESTPlus的规范,也能自动处理参数校验与错误提示。- 在Swagger UI测试时,直接在参数表单中填写
username值并选择文件即可,Swagger会自动以multipart/form-data格式发送请求,匹配解析逻辑。
内容的提问来源于stack exchange,提问作者Shaikh Shoeb
相关产品推荐
相关产品推荐

