Flask:在两个服务器之间发送文件会导致接收服务器上的“request.files”为空

问题描述 投票:0回答:1

我正在尝试将文件从一台 Flask 服务器 (

Server 1
) 发送到另一台 Flask 服务器 (
Server 2
),然后再返回。但是,当文件到达
Server 2
时,
request.files
对象看起来为空,导致在尝试访问它时出现 KeyError。

这是我的服务器的基本设置:

服务器1:

from flask import Flask, request
import requests

app = Flask(__name__)

@app.route('/test', methods=['POST'])
def test():
    file = request.files['file'].read()
    print(file)
    
    response = requests.post(url="http://127.0.0.1:5002/test",
                             headers=request.headers,
                             files={'file': file}
                             )
    
    return response.json(), response.status_code

if __name__ == "__main__":
    app.run(port=5000)

服务器2:

from flask import Flask, request

app = Flask(__name__)

@app.route('/test', methods=["POST"])
def test():
    file = request.files['file']  # <-- KeyError occurs here
    print(file)
    
    return 1, 200

if __name__ == "__main__":
    app.run(port=5002, debug=True)

这是错误

127.0.0.1 - - [23/Mar/2024 10:09:02] "POST /test HTTP/1.1" 500 -
Traceback (most recent call last):
  File "C:\Users\gratu\anaconda3\envs\ML\lib\site-packages\flask\app.py", line 1488, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:\Users\gratu\anaconda3\envs\ML\lib\site-packages\flask\app.py", line 1466, in wsgi_app
    response = self.handle_exception(e)
  File "C:\Users\gratu\anaconda3\envs\ML\lib\site-packages\flask\app.py", line 1463, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\gratu\anaconda3\envs\ML\lib\site-packages\flask\app.py", line 872, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\gratu\anaconda3\envs\ML\lib\site-packages\flask\app.py", line 870, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\gratu\anaconda3\envs\ML\lib\site-packages\flask\app.py", line 855, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)  # type: ignore[no-any-return]
  File "C:\Users\gratu\Projects\flasktest\app2.py", line 10, in test
    file = request.files['file']
  File "C:\Users\gratu\anaconda3\envs\ML\lib\site-packages\werkzeug\datastructures\structures.py", line 192, in __getitem__
    raise exceptions.BadRequestKeyError(key)
werkzeug.exceptions.BadRequestKeyError: 400 Bad Request: The browser (or proxy) sent a request that this server could not understand.
KeyError: 'file'

当文件从

Server 1
发送到
Server 2
时,
request.files
上的
Server 2
对象显示为空,从而导致 KeyError。我已经确认文件已从
Server 1
正确发送,因为我可以在打印时看到 request.files 字典以及我发送的文件。

我不确定为什么

request.files
对象在
Server 2
上是空的。我的设置或代码中缺少什么吗?任何有关如何解决此问题的见解或建议将不胜感激。谢谢!

python python-3.x flask server client
1个回答
0
投票

事实证明问题是在标题上传递的。当我删除标题后,它开始正常工作。

from flask import Flask, request
import requests

app = Flask(__name__)

@app.route('/test', methods=['POST'])
def test():
    file = request.files['file'].read()
    print(file)
    
    response = requests.post(url="http://127.0.0.1:5002/test",

                             files={'file': file}
                             )
    
    return response.json(), response.status_code

if __name__ == "__main__":
    app.run(port=5000)
© www.soinside.com 2019 - 2024. All rights reserved.