Python 从请求检索post数据时速度慢?

Python 从请求检索post数据时速度慢?,python,json,flask,werkzeug,Python,Json,Flask,Werkzeug,我正在编写一个flask应用程序,它接受带有json数据的POST请求。我注意到,根据传递给应用程序的数据大小,响应时间存在巨大差异。调试之后,我将问题缩小到从请求对象检索json数据的那一行。可能需要注意的是,测试是在flask开发服务器上完成的 start = time.time() resp = json.dumps(request.json) return str(time.time() - start) 我对这行和1024个字符(可能不是巧合)及更少字符的数据进行计时,这需要0.00

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

start = time.time()
resp = json.dumps(request.json)
return str(time.time() - start)
我对这行和1024个字符(可能不是巧合)及更少字符的数据进行计时,这需要0.002s,超过1024个字符的数据需要1秒! 这里发生了什么?这是开发服务器的限制吗

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

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

编辑: 我开始深入研究Werkzeug模块,发现在从BaseHTTPRequestHandler传递的wsgi.py模块中读取响应消息
self.\u read(to\u read)
时会出现缓慢。还是不知道为什么这么慢。


以下是环境详细信息: Ubuntu-10.04 Python-2.6.5 烧瓶-0.9
Werkzeug-0.8.3

预计flask开发服务器速度会很慢。发件人:

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

正如Marcus在评论中提到的,另一个WSGI服务器(如gunicorn或tornado)将更快、更可靠,因此一定要使用其中一个进行部署和基准测试


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

我在这样一条线路上遇到了这个问题,大约需要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在检索“多部分/表单数据”内容类型时有问题。

如果使用curl发送请求,
Expect:100 continue
可能会导致该行为。我在uwsgi、flask和curl中遇到了类似的行为。我的情况如下:

  • 如果请求正文大小大于1024字节,curl将使用Expect:100 continue标头发布数据
  • 但是,uwsgi无法处理标头。所以uwsgi没有响应100,继续
  • curl等待100 continue响应,直到大约1秒超时

了解卷曲行为对我很有用。

可能与此有关吗?barracel这不是它。你能用任何其他独立的WSGI服务器复制它吗?比如古尼科恩,龙卷风。。。见马库斯,好主意。我尝试了Tornado,但无法复制该问题。我在瓶子中使用BaseHTTPRequestHandler时遇到问题,而不是在烧瓶中。但这可能是同样的问题,开发环境正试图将ip地址解析为主机名,因此它们可能会延迟查找超时。也许这是一条捷径,但它可能会指引你正确的方向。