Flask在从请求中检索发布数据时变慢了吗?

时间:2012-11-22 01:07:01

标签: python json flask werkzeug

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

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

我计时这行,对于1024的数据(可能不是巧合)和较少的字符,这需要0.002s,超过1024的任何超过1秒! 这里发生了什么?这是开发服务器的限制吗?

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

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

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


这是环境细节: Ubuntu - 10.04 Python - 2.6.5 烧瓶 - 0.9 Werkzeug - 0.8.3

3 个答案:

答案 0 :(得分:4)

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

  

您可以在开发期间使用内置服务器,但应该为生产应用程序使用完整部署选项。 (不要在生产中使用内置开发服务器。)

正如Marcus在评论中提到的那样,另一个WSGI服务器如gunicorn或tornado会更快更可靠,所以肯定会使用其中一个用于部署和基准测试。

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

答案 1 :(得分: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

我认为flask在检索“multipart / form-data”内容类型方面存在问题。

答案 2 :(得分:0)

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

  • 如果请求正文的大小大于1024字节,则curl将使用Expect:100-continue标头发布数据。
  • 但是,uwsgi无法处理标头。因此,uwsgi不会响应100-继续。
  • curl等待100个连续响应,直到大约一秒钟超时。

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