烧瓶从请求中检索帖子数据很慢?

问题描述 投票:25回答:3

我正在编写烧瓶应用程序,该应用程序接受带有json数据的POST请求。我注意到根据传递给应用程序的数据大小,响应时间存在巨大差异。调试后,我将问题缩小到从请求对象检索json数据的那一行。可能需要注意的是,测试是在flask开发服务器上完成的。

start = time.time()
resp = json.dumps(request.json)
return str(time.time() - start)

我为这行计时,对于1024个数据(可能不是巧合)和更少的字符,这花费了0.002s,并且对于超过1024秒的任何内容都花费了1秒!这是怎么回事这是开发服务器的限制吗?

编辑:通过request.form.get('somedata')获取内容长度超过1024的POST数据也会发生同样的事情

编辑:我无法使用Apache提供的相同示例来复制问题

编辑:我开始深入研究Werkzeug模块,发现在读取从BaseHTTPRequestHandler传递的wsgi.py模块中的响应消息self._read(to_read)时,速度变慢。仍然不知道为什么这么慢。


这里的环境详细信息:Ubuntu的-10.04Python-2.6.5烧瓶-0.9Werkzeug-0.8.3

python json flask werkzeug
3个回答
4
投票

烧瓶开发服务器预计会变慢。从http://flask.pocoo.org/docs/deploying/

您可以在开发过程中使用内置服务器,但是应该对生产应用程序使用完整的部署选项。 (请勿在生产中使用内置的开发服务器。)

[正如Marcus在评论中提到的那样,像gunicorn或龙卷风这样的WSGI服务器将更快,更可靠,因此绝对可以使用其中之一进行部署和基准测试。

[如果您担心在开发过程中会很快工作,则可以像在部署中一样在开发中使用gunicorn。例如,如果要部署到heroku,则可以运行“ foreman start”,并且gunicorn服务器将立即启动。


2
投票

我在这样的线上遇到了这个问题,大约需要1.0秒!在烧瓶后处理程序中:

username=request.form.get('username')

我正在用curl -F测试它:

curl -F username="x" http://127.0.0.1:5000/func

我刚刚将-F更改为-d,并且得到了0.0004秒!!

curl -d username="x" http://127.0.0.1:5000/func

我认为烧瓶在检索“多部分/表单数据”内容类型时遇到问题。


0
投票

如果使用curl发送请求,则Expect: 100-continue可能会导致此行为。我在uwsgi,长颈瓶和卷发中遇到了类似的行为。我的情况如下:

  • 如果请求主体的大小大于1024字节,curl将发布带有Expect:100-continue header的数据。
  • 但是,uwsgi无法处理标题。因此uwsgi不会响应100-continue。
  • 卷曲等待100个继续响应,直到大约一秒钟超时。

When curl sends 100-continue | Georg's Log对我了解卷曲行为很有用。

© www.soinside.com 2019 - 2024. All rights reserved.