【问题标题】:How to detect changes in extra files, and reload app, when deploying a Flask app? [closed]部署 Flask 应用程序时如何检测额外文件的更改并重新加载应用程序? [关闭]
【发布时间】:2016-08-10 15:04:36
【问题描述】:

我在 Flask 中构建了一个小型 Web 应用程序,并尝试将其部署在 Pythonanywhere 上。

在开发过程中,我使用本地服务器并启动我的应用程序:

if __name__ == '__main__':
    app.run(debug=True,extra_files=['./static/results.csv',])

results.csv 用作一个小型数据库(我不需要更多),每次在文件中添加一行时,从 Flask 表单提交,应用程序都会重新启动。然后我得到:

Detected change in '/Users/rodolphegonzales/sync/Survey/app/static/results.csv', reloading

一旦我在 Pythonanywhere 上部署,这将不再起作用。当我跑步时:

if __name__ == '__main__':
    app.run(debug=False,extra_files=['./static/results.csv',])

我明白了:

Internal Server Error. The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.

查看日志,这是因为未检测到 results.csv 中的更改,并且未重新加载应用程序。

在部署 Flask 应用时如何正确检测额外文件的变化?

编辑:文件更改检测和重新加载显然不可能在调试模式之外进行。触摸 WSGI 应该会自动重新加载,我试试看。

【问题讨论】:

标签: python web-applications flask web-deployment pythonanywhere


【解决方案1】:

这与重新加载器无关(嗯,至少不是你想的那样)。 PythonAnywhere 为您运行一个 WSGI 服务器,指向您的应用程序。如果你无条件调用开发服务器,它将阻塞,PythonAnywhere 的服务器将永远不会接听它。

将调用移至 __name__ 守卫内的开发服务器。

if __name__ == '__main__':
    app.run(...)

您不应该在生产环境中自动重新加载应用程序(并且基于 PythonAnywhere 的工作方式,您不能这样做,您需要手动重新加载)。根据您所描述的,您根本不需要重新加载它,只需在需要获取数据时重新读取静态文件即可。鉴于大多数 WSGI 服务器在多个进程中运行,您可能会因为一次从多个进程写入简单文件而面临损坏简单文件的风险。这就是您使用数据库的原因。

【讨论】:

    【解决方案2】:

    好的,我对它在部署中的工作原理知之甚少,这让我很困惑。事实证明,除了使用 debug = True 进行开发之外,据我所知,我不能自动观察更改的文件并通过 app.run(...) 中的参数重新加载应用程序。一个解决方案是在提交另一个表单时“触摸”Pythonanywhere 的 wsgi 文件(在这种情况下,应用程序会重新加载)。我是这样做的:

    import os
    os.utime('/var/www/USERNAME_pythonanywhere_com_wsgi.py', None)
    

    这似乎可以解决问题。感谢您的帮助!

    【讨论】:

      猜你喜欢
      • 2012-03-19
      • 2019-02-11
      • 2013-12-31
      • 2019-04-03
      • 2022-06-11
      • 1970-01-01
      • 2015-05-09
      • 2014-06-17
      相关资源
      最近更新 更多