python - 尝试将带有文件的数据表单转发到另一个 Web 服务
问题描述
我正在尝试将数据表单请求转发到另一个 Web 服务,但是当我在另一个 Web 服务中收到新请求时,它包含表单数据,但不包含文件数据:
[+] Forward 1: ImmutableMultiDict([('content', <FileStorage: '0,1.txt' ('text/plain')>)])
[+] Forward 2: ImmutableMultiDict([('content', <FileStorage: 'content' (None)>)])
在代码中,您可以看到索引呈现表单。您选择一个文件,它会将其发送到第一个 Web 服务 (forward1)。在此 Web 服务中,它尝试将 request.form 和 request.files 发送到第二个 Web 服务(forward2)。但并非所有信息都正确到达。
会发生什么?
我已经尝试过了,但是这个解决方案对我不起作用。 将多部分/表单数据转发到不同的服务(python、bottle、请求)
import requests
from flask import Flask, request, url_for
from werkzeug.datastructures import FileStorage
app = Flask(__name__)
@app.route('/')
def index(methods=['GET', 'POST']):
return """<html>
<form method="post" action="{}" enctype="multipart/form-data">
<input name="content" type="file" />
<input type="submit">
</form>
</html>""".format(url_for('forward1'))
@app.route('/fw1', methods=['GET', 'POST'])
def forward1():
if request.method == "POST":
payload = request.form
files = request.files
print("[+] Forward 1:", request.files)
response = requests.request(
"POST",
"http://XXX.XXX.XXX.XXX:5000/fw2",
data=payload,
files=files
)
return ""
@app.route('/fw2', methods=['GET', 'POST'])
def forward2():
if request.method == "POST":
print("[+] Forward 2:", request.files)
return ""
if __name__ == '__main__':
app.run(host='0.0.0.0', debug = True)
解决方案
解决方案:
response = requests.request(
"POST",
"http://XXX.XXX.XXX.XXX/fw2",
data=payload,
files={files["file"].name : (files["file"].filename, files["file"].file, files["file"].mimetype)}
)
推荐阅读
- pandas - 比较基于另一列的列的最佳和最快方法是什么
- keras - 将 2 个模型的输出相乘,并将该层用作第三个模型的输出
- vim - 在 Vim 中自动显示函数文档
- automation - 利用宏在 bigquery 上的多个模式上不再在 dbt 中删除旧关系
- algorithm - 最近邻搜索的二维树实现苦苦挣扎
- python-3.x - FastApi 为我的一个参数返回“必填字段”和“value_error.missing”,但该字段存在
- r - 识别 R 图中的值
- npm - npm lock-file 锁定包版本
- ios - UIPickerView 中的 UILabel 上的额外空间
- c++ - 如果参数包右侧包含简单类型参数,为什么可变参数模板参数包保持相同大小?