如何确定Tornado/Flask/Python中HTTP请求上传花了多长时间?
注意:如果不对 Flask
/WSGI
/Tornado
进行修改,这可能无法实现(这是不可接受的)。 请查看下面的“为什么不直接修改代码?”部分。
我需要让我的 Flask
/WSGI
/Tornado
服务器知道一个 HTTP 客户端上传数据的时间,尤其是在处理大规模的 POST
/PUT
请求时。我发现所有的 Flask
/Tornado
回调函数只有在整个 Content-Length
上传完成后才会被调用。
我需要这些信息,以便更好地处理慢请求,或者优先处理那些上传速度快的请求等等。
然而,我在 Flask
、Werkzeug
或 Tornado
中找不到任何可以用来获取这些信息的回调函数,也没有在 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 个回答
不太确定这是不是个好主意,但你可以试试 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文档中试过上传的例子,似乎运行得很好。