Flask无法处理请求

9

最近我在开发一个Flask网站/ API应用程序,部署到Windows服务器上时出现了一些奇怪的问题。

当有人请求某个URL时,偶尔(大约10次中有3-4次)会出现挂起的情况。为了使该请求通过,我只需要进入命令行,启动Flask服务器,并发送一个中断信号(我在Windows上,所以基本上是“Ctrl + C”)。我已经谷歌搜索了一段时间,但我相信没有一个解决方案适用于这种情况。以下是我的尝试:

  • app.run()中添加threaded=true,如此处所建议的,不起作用。
  • 这篇文章中,作者提到一些浏览器可能会同时发起多个请求,从而使服务器困惑。这里可能也不适用,因为我尝试使用Python的requests库发出请求,仍然看到服务器挂起。
  • 这里所提到的那样使用Gevent或Tornado来服务应用程序也没有起作用。
  • 尝试在Python 3和Python 2.7上进行,出现了相同的问题。

我的本地机器(win7 64位)和服务器基本上是相同的设置,但所有东西都正常工作。 (遇到问题的服务器是Windows Server 2012)

我很想分享一些代码,但我非常怀疑它可能是代码问题,因为本地环境完全正常。

有人之前经历过同样的问题吗?


Flask自带的服务器仅适用于开发环境。在生产环境中,请使用gunicorn或uwsgi来运行服务器。 - nathancahill
@nathancahill 我明白,我只是还在调试阶段。正如我在帖子中提到的,我使用的是Windows系统,所以不清楚gunicorn或nginx是否适用于Windows... - xbb
你在这个链接 http://flask.pocoo.org/ 的示例应用程序遇到了问题吗? - nathancahill
2个回答

6

在与同事核实后(我本应该早点这样做),似乎命令行工具本身存在问题...(简直不敢相信)。在将其设置为 Windows 计划任务后,进行了几百个请求,并没有出现任何问题。


0

这里说的每一件事都是真实的 - 只要你以正确的方式组合起来 ;-)

  1. 如OP所述,可能是您的浏览器正在发出多个请求。例如,我在Chrome中遇到了这个问题,但在像nc(netcat)或curl或wget这样的简单方法中没有遇到。
  2. 同样如OP所述- 您需要多线程flask。
  3. 但在OP中- 当您添加了“threading”选项时,如果您正在运行flask CLI工具,则此选项不起作用。
  4. 因此,在接受的答案中,当您切换到“Windows计划任务”时,它可以正常工作-可能是因为您直接调用了脚本,而不是通过flask cli程序调用脚本,并且脚本具有threaded=true-仅当您直接调用脚本时才会应用(没有flask CLI)。因此,这是一个正确的答案-但原因不同。
  5. 另一种方法是使用flask CLI正确启用线程。只需将--with-threads添加到flash命令即可。
总之,有两种正确的方法可行:
  • app.run()中添加threaded=true并直接运行脚本
  • flask CLI程序中添加--with-threads并以这种方式运行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接