Flask: 两个服务器间传送文件导致接收服务器 `request.files` 为空

0 投票
1 回答
15 浏览
提问于 2025-04-13 00:09

我正在尝试从一个Flask服务器(Server 1)发送文件到另一个Flask服务器(Server 2),然后再返回。但是,当文件到达Server 2时,request.files对象似乎是空的,这导致我在访问它时出现了KeyError错误。

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

Server 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)

Server 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时,Server 2上的request.files对象似乎是空的,这导致了KeyError错误。我确认文件是从Server 1正确发送的,因为我打印时可以看到request.files字典里有我发送的文件。

我不明白为什么Server 2上的request.files对象是空的。我的设置或代码中是否有什么我遗漏的?如果有任何见解或建议来解决这个问题,我将非常感激。谢谢!

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)

撰写回答