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

注意:如果不进行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是可以接受的,因为标头通常比正文小得多)

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

参考方案

不知道这是否是一个好主意,但是您可以尝试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文档中尝试了上传示例,并且看起来工作正常。

flask:异常后停止服务器 - python

我想在发生未处理的异常时立即停止我的Flask服务器。这是一个例子:from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): 1/0 # argh, exception return 'Hello World!' i…

Flask-RESTful-返回自定义响应格式 - python

我已经按照以下Flask-RESTful文档定义了自定义响应格式。app = Flask(__name__) api = restful.Api(app) @api.representation('application/octet-stream') def binary(data, code, headers=None): resp =…

如何在Flask中生成临时下载? - python

我有一个Flask应用,可让用户下载MP3文件。如何使下载的URL仅在特定时间段内有效?例如,我不想让任何人简单地转到example.com/static/sound.mp3并访问文件,而是希望验证每个请求以防止不必要的带宽。我正在使用Apache服务器,但是如果更容易实现,我可能会考虑切换到另一个服务器。另外,我不想使用Flask来提供文件,因为这会通过迫…

Flask_SQLAlchemy无法像SQLAlchemy那样反映数据库 - python

我正在尝试使用python-Flask将Foreigner Database连接到Flask_SQLALchemy应用我到处都看过,包括FLASK_SQLALCHEMY official doc 过去4天里,我一直在Internet上到处寻找FLASK_SQLALCHEMY中没有ORM库的任何教程,但运气不佳我一直在查看SQLAlchemy Reflecti…

带后台线程的烧瓶应用程序 - python

我正在创建一个flask应用程序,对于一个请求,我需要运行一些长时间运行的作业,而无需在UI上等待。我将创建一个线程并将消息发送到UI。该线程将计算并更新数据库。但是,UI在提交后会看到一条消息。下面是我的实现,但是它正在运行线程,然后将输出发送到我不喜欢的UI。如何在后台运行此线程?@app.route('/someJob') def …