我在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应该会自动重新加载,我会尝试一下。
答案 0 :(得分:1)
这与重新加载器无关(好吧,至少不是你想的那样)。 PythonAnywhere为您运行WSGI服务器,指向您的应用程序。如果你无条件地调用开发服务器,它将阻塞,PythonAnywhere的服务器将永远不会接收它。
将呼叫转移到__name__
后卫内的开发服务器。
if __name__ == '__main__':
app.run(...)
您不应该在生产中自动重新加载应用程序(并且基于PythonAnywhere的工作方式,您将无法手动重新加载)。根据您所描述的内容,您根本不需要重新加载它,只需在需要获取数据时重新读取静态文件。鉴于大多数WSGI服务器在多个进程中运行,您可能会立即通过从多个进程写入来破坏您的简单文件。这就是您使用数据库的原因。
答案 1 :(得分:0)
好的,我对部署如何工作的了解很少。事实证明,我不能,在开发之外使用debug = True,并且据我所知,自动观察已更改的文件并通过app.run(...)中的参数重新加载应用程序。解决方案是在提交另一个表单的任何时候“触摸”Pythonanywhere的wsgi文件(在这种情况下重新加载应用程序)。我是这样做的:
import os
os.utime('/var/www/USERNAME_pythonanywhere_com_wsgi.py', None)
这似乎可以解决问题。谢谢你的帮助!