同时托管Flask网页应用和CRON触发的Python脚本
我有一个Python程序,它从网上获取数据,保存到数据库里,并发送一些条件警报。
我还有一个网页应用程序,会把这些数据展示在网站上。前面提到的Python程序会把要展示的数据保存到一个叫做Pickle的对象里,然后网页应用会打开这个对象。
最终这些程序会放在我的虚拟私人服务器(VPS)上。
现在我在本地机器上运行这个网页应用,但还没有把它发布到网上。获取数据的程序每分钟通过CRON运行一次。
关于这个网页应用(是基于Miguel Grinberg的Flask超级教程做的),我是不是只需要在根文件夹里运行“run.py”这个脚本,然后把它放到后台,这样即使我关闭命令行,它也能继续运行?
我怎么确保网页上显示的数据总是最新的,是由获取数据的程序保存的?它会在浏览器里自动刷新吗?这些程序之间需要进一步分开吗?
文件结构如下:
my_program_root_FOLDER
- run.py (for web_app)
- polling_program_code_FOLDER
-- file_run_via_CRON_for_polling
- web_app_FOLDER
-- static_FOLDER
--- Pickle_object (with data for web app)
2 个回答
关于这个网络应用(是基于Miguel Grinberg的超棒Flask教程做的),我是不是只需要在根文件夹里运行“run.py”脚本,然后把它放到后台,这样我关闭命令行后它还能继续运行呢?
不行,你需要用一些工具,比如screen
,不过最好的办法是把你的应用程序当作一个服务来运行,使用某种服务管理工具,这样可以确保你的应用在崩溃后自动重启。uwsgi就可以做到这一点,还有其他的选择,比如supervisord或者runit。如果你的应用是对外网开放的,别忘了关闭Flask的调试模式。
我怎么才能确保在网页上显示的数据总是最新的,都是由轮询程序保存的?它会在浏览器里自动刷新吗?这些数据需要进一步分类吗?
如果你在应用里没有实现某种缓存机制,每次请求都会重新渲染模板,这样就能确保总是获取到最新的数据。另一方面,如果你想让浏览器里的页面在新数据到达时自动更新,而不需要用户手动刷新,可以用JavaScript和长轮询来实现。不过这里很难给出具体的建议,因为不太清楚你具体想做什么。
你在 cron
中运行的程序,如果你想要持续看到更新的结果,也可以在 Linux 的 screen
中运行它。在你的本地电脑上,你是用 Flask
自带的开发服务器来运行你的网页应用。但在你的 VPS(虚拟专用服务器)上可不能用这个。我建议你使用 uwsgi
加 nginx
的组合。