如何确定Tornado/Flask/Python中HTTP请求上传花了多长时间?

2 投票
1 回答
745 浏览
提问于 2025-05-10 10:05

注意:如果不对 Flask/WSGI/Tornado 进行修改,这可能无法实现(这是不可接受的)。 请查看下面的“为什么不直接修改代码?”部分。

我需要让我的 Flask/WSGI/Tornado 服务器知道一个 HTTP 客户端上传数据的时间,尤其是在处理大规模的 POST/PUT 请求时。我发现所有的 Flask/Tornado 回调函数只有在整个 Content-Length 上传完成后才会被调用。

我需要这些信息,以便更好地处理慢请求,或者优先处理那些上传速度快的请求等等。

然而,我在 FlaskWerkzeugTornado 中找不到任何可以用来获取这些信息的回调函数,也没有在 Flask.request 对象中找到相关的成员。

关于 lord63-j 提供的答案虽然真的很酷,但这并不是我需要的。因为在调用 app.route() 处理函数时,整个 POST/PUT 数据已经上传完毕。

为什么不直接修改代码?

经过深入研究,发现修改代码的最佳位置是在 HTTP1Connection.start_serving 中,添加一个 start time,这样 WSGI/Flask 就可以使用这个时间。可惜的是,委托的 data_received 未来只接受主体数据作为参数,这意味着这个 start time 数据在传递时会丢失。

另外,Tornado_RequestDispatcher.headers_received(开始)和 execute(完成)函数可以被修改,以在每个阶段存储当前时间,但你仍然会面临将时间传递给 WSGI/Flask 的问题。(headers_received 是可以接受的,因为头部通常会比主体小得多)

正如你所看到的,这很快就变成了一个复杂的问题。

相关文章:

  • 暂无相关问题
暂无标签

1 个回答

0

不太确定这是不是个好主意,但你可以试试 after_this_request

这里有个简单的例子:

import time

from flask import Flask, after_this_request

app = Flask(__name__)

@app.route('/')
def index():
    before = time.time()
    @after_this_request
    def cal_time(response):
        print(time.time() - before)
        return response
    return 'Hello, world.'

if __name__ == '__main__':
    app.run(debug=True)

然后你应该能在控制台看到时间被打印出来。

 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
0.000116109848022
127.0.0.1 - - [17/Nov/2015 20:41:51] "GET / HTTP/1.1" 200 -

你可以试试看,看看对你是否有效。我在Flask文档中试过上传的例子,似乎运行得很好。

撰写回答