【问题标题】:How do I determine how long a HTTP request took to upload on Tornado / Flask / Python?如何确定在 Tornado / Flask / Python 上上传 HTTP 请求需要多长时间?
【发布时间】:2016-02-18 07:18:57
【问题描述】:

注意:如果不修改Flask/WSGI/Tornado,这可能是不可行的(这是不可接受的)。请参阅“为什么不只是修改代码?”下面的部分。

我需要让我的Flask/WSGI/Tornado 服务器确定 HTTP 客户端将其数据上传到大型 POST/PUT 需要多长时间。我看到的所有 Flask/Tornado 回调只有在整个 Content-Length 上传后才会调用。

我需要这些信息,以便更好地服务缓慢的请求和/或将快速上传的请求优先于较慢的请求等。

但是,我在FlaskWerkzeugTornado 中没有看到任何可用的回调,也没有在Flask.request 对象上看到用于获取此信息的成员。

关于lord63-j给出的答案:虽然很酷,但这不是我们所需要的。在调用app.route() 处理程序时,整个POST/PUT 数据已经上传。

为什么不直接修改代码?

Spelunking 表明修改代码的最佳位置是在 HTTP1Connection.start_serving 中,添加 start time 以便 WSGI/Flask 然后可以使用。 很遗憾,代理的 data_received 未来仅将主体数据作为参数,这意味着该 start time 数据在传递时将丢失。

或者,Tornado_RequestDispatcher.headers_received(开始)和execute(完成)函数可以修改为存储每个阶段的当前时间,但您仍然会遇到将时间传递给@987654350 的问题@/Flaskheaders_received 是可以接受的,因为标题通常比正文小得多)

如您所见,这很快就变成了兔子洞。

【问题讨论】:

  • 发现这可能对你有帮助..flask.pocoo.org/docs/0.10/patterns/fileuploads/…
  • 感谢您的链接!不幸的是,我不认为它能让我更进一步:当 Flask、Werkzeug 和 Tornado 跳起不可发音的舞蹈时,数据已经上传了……这似乎反映在链接中。但是,它确实有一些我感兴趣的其他东西。谢谢!

标签: python flask tornado wsgi


【解决方案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 -

您可以尝试一下,看看它是否适合您。我尝试了烧瓶文档中的上传示例,似乎工作正常。

【讨论】:

    猜你喜欢
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    相关资源
    最近更新 更多