【问题标题】:Flask returns a response without even checking filesFlask 甚至不检查文件就返回响应
【发布时间】:2019-02-11 10:05:39
【问题描述】:

我试图更准确地了解 Http 连接如何与 Flask 一起工作,因此我尝试编写一个非常简单的应用程序和另一个简单的请求连接:

app = Flask('file-streamer')

@app.route("/uploadDumb", methods=["POST"])
def upload_dumb():
    print("Hello")
    return Response(status=200)

然后我通过请求向端点发送一个大文件(1.5 GB):

url = "http://localhost:5000/uploadDumb"
values = {"file": open(file, "rb")}
r = requests.post(url=url, data={}, files=values)

我希望 Flask 等待整个文件被发送,即使该文件是无用的。然而,这不是正在发生的事情,而是 Flask 非常快地返回 200 响应,这会导致我的第二个脚本出现 BrokenPipeError。

有人可以向我解释这里发生了什么吗?

【问题讨论】:

  • 你确定是 Flask 而不是 Requests 吗?您是否尝试过启用调试日志记录?您是否尝试过使用 curl 等其他工具上传文件?
  • 是的,我试过用django实现同一种最小的app,没有问题,就是等待发送文件。我也尝试使用 requests 和 requests-toolbelt,但问题仍然存在。

标签: python flask python-requests


【解决方案1】:

我想这是因为 Flask 正文解析是惰性的(实际上这是一件好事)。因此,当请求到来时,Flask 只会读取标头,直到以某种方式访问​​主体(通过 request.data、request.files、request.json() 等)。因此,要触发完整的正文(和文件)上传,请尝试访问请求正文以使 Flask 解析文件,例如:

_ = request.data

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-29
    • 2020-07-24
    • 2018-04-06
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多