如何在Flask中转发/重构携带文件数据的POST请求
问题解答
直接传Flask request对象的方案可行性
requests.post("url_of_api", request) 方案不可行。
Flask 封装的request是Werkzeug框架的请求实例,和requests库的入参结构完全不兼容,requests无法自动从中提取请求体、文件、头部等有效信息,直接传递无法生成正确的转发请求。
正确构造转发请求的方法
你之前的写法缺少文件MIME类型指定,且固定了文件名,才会出现请求体字节差异、丢失MIME的问题,按以下步骤构造即可完全复现原始上传请求的结构:
- 提取完整的文件信息,不要硬编码文件名,同时保留原始的MIME类型
# 从Flask请求中取出上传的文件对象 audio_file = request.files["audio_data"] # 构造files参数,按 (原始文件名, 文件字节流, 原始MIME类型) 格式传递 files = { "audio_data": (audio_file.filename, audio_file.stream.read(), audio_file.content_type) }
- 如果原请求还附带其他表单字段,同步提取表单数据:
# 提取所有普通表单字段 form_data = request.form.to_dict()
- 发送转发请求
resp = requests.post( "url_of_api", data=form_data, files=files )
如果需要转发原请求中的特定头部(比如鉴权标识、自定义业务头),可以额外补充headers参数,按需从request.headers中提取对应字段传入即可。
字节差异原因说明
你观测到的首尾少46字节的问题,是因为requests在构造multipart/form-data格式的请求体时,会为每个文件字段补充文件名、Content-Type等元信息。你之前的写法没有传MIME类型、硬编码了文件名,会导致这部分元信息的长度和原始请求不一致,就是你观测到的字节差来源,按上述方法传递完整的文件三要素即可消除差异。
内容的提问来源于stack exchange,提问作者Tran Lan Anh Phan
相关产品推荐
相关产品推荐

