基于SAM部署的Serverless Flask API处理multipart/form-data时崩溃问题求解
问题成因
该报错的核心原因是使用的flask-lambda版本未适配API网关的二进制请求体处理逻辑:
- 你配置的
BinaryMediaTypes已经生效,API网关(包括sam local模拟环境)收到multipart/form-data类型的请求时,会将二进制请求体编码为base64格式的字符串,同时在事件参数中标记isBase64Encoded: True - 官方原版的
flask-lambda早已停止维护,没有针对isBase64Encoded字段做特殊处理,直接将字符串类型的base64编码内容传给了Werkzeug的表单解析器 - Werkzeug的multipart解析器预期接收字节流作为输入,拿到字符串后执行操作时触发类型错误,即你看到的
TypeError: 'str' object cannot be interpreted as an integer报错
解决方案
可任选以下两种方案修复:
方案1:更换社区维护的兼容版本flask-lambda
官方原版flask-lambda不支持Python3.7以上版本的新特性,也不兼容API网关的二进制处理逻辑,可直接替换为社区维护的兼容版本flask-lambda-python39:
- 卸载原有依赖:
pip uninstall flask-lambda - 安装新依赖:
pip install flask-lambda-python39 - 原有业务代码无需修改,该版本已内置base64请求体自动解码逻辑,可直接正常解析
form-data格式的参数和上传文件
方案2:手动添加base64解码逻辑
如果不想更换依赖包,可自行继承重写FlaskLambda的请求处理方法,在请求进入路由前完成base64解码:
from flask import request, jsonify from flask_lambda import FlaskLambda import base64 class Base64AwareFlaskLambda(FlaskLambda): def __call__(self, event, context): # 解码base64格式的二进制请求体 if event.get('isBase64Encoded', False): event['body'] = base64.b64decode(event['body']) return super().__call__(event, context) app = Base64AwareFlaskLambda(__name__) @app.route('/kits', methods=['POST']) def lambda_handler(): print(request.form['title']) print(request.form['description']) print(request.form['kitType']) # 也可正常获取上传的文件 # files = request.files.getlist('your_file_field') return jsonify("success"), 201
可选校验项
如果修改后仍有报错,可检查以下配置:
- 确认
template.yaml中的BinaryMediaTypes配置已正确部署,sam本地测试时可打印event参数的isBase64Encoded字段,确认值为True - 确认Postman调用时未手动修改
Content-Type请求头,不要自行添加boundary参数,让Postman自动生成即可
内容的提问来源于stack exchange,提问作者Torrance Graham
相关产品推荐
相关产品推荐

