有没有人知道如何在任何模块更改时让mod_wsgi
自动重新加载Flask应用程序?我试过WSGIScriptReloading On
,但没有运气。 official documentation是一种熊......如果没有人知道,我想我会给它一个刺。提前谢谢!
此外,如果它无法在语法错误(例如Flask重新加载器)上永久崩溃,那就太棒了。
答案 0 :(得分:14)
使用mod_wsgi
,WSGIScriptReloading
会查找.wsgi
配置文件的更改,而不是代码。
我的工作流程是上传我的代码更改,然后
$ touch MyWebApp.wsgi
导致上次修改的文件时间戳更改,mod_wsgi
重新加载代码。
您可以通过在本地计算机上保存.wsgi
文件然后再次上传来“远程”执行此操作,或者我只是通过SSH执行此操作。
你可以对语法错误做很多事情,代码是运行还是不运行,但是修复加上touch
会让它再次运行。
如果您是通过FTP工作,请注意以下事项:确保上传“已触摸”.wsgi
文件最后,否则会尝试使用错误的代码启动
答案 1 :(得分:1)
我认为想要在生产中自动重新加载源代码是非常现实的情况。考虑一个环境,其中每个版本部署了源,并且“生产”符号链接指向其中一个版本。每当您想要发布更新版本时,只需将符号链接指向另一个路径即可。但是apache和mod_wsgi仍然从symlinked目录中收集文件,因此需要根据时间戳,大小或w / e建立重新加载机制。当然,一个应用程序可能不是问题,但是如何托管15-20个正在进行积极开发的应用程序?与每次重启apache相比,在这种情况下不会自动重新加载源是一种纯粹的损失。
回到问题:如果您正在使用的框架(在本例中为烧瓶)没有用于自动源代码重新加载的插件或工具,那么Graham和Malphas描述的两个选项是您的最佳选择。触发wsgi进程重启或实现监控系统。
答案 2 :(得分:1)
您正确地添加了WSGIScriptReloading指令。 Flask文档没有100%明确,但Apache会查找对.wsgi文件的更改。推荐的解决方案是在您的.wsgi文件上执行touch命令,作为发布过程的一部分。
答案 3 :(得分:0)
你是什么意思'官方文件有点像熊'?包含的食谱有什么问题:
该文档还解释了为什么WSGIScriptReloading没有达到预期效果。
并且不可能在语法错误上永久崩溃。它嵌入在Apache中,而Apache的全部意义在于保持运行。
听起来你不应该使用Apache / mod_wsgi进行开发。每个人都知道不应该在生产中使用自动源代码重装,所以无法想象你会想要这样做。
答案 4 :(得分:0)
对于制作我也更喜欢apache mod_wsgi,而对于开发我使用了烧瓶的内置服务器。我将prod和dev配置文件分开,然后在dev配置中设置debug
指令True
,以便Flask可以自动检测并重新加载代码更改。
答案 5 :(得分:0)
此问题的正确答案是WSGIScriptReloading On
需要添加到000-default.conf
文件夹下的/etc/apache2/sites-enabled
。
见下面的例子
<VirtualHost *:80>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com
ServerName sentiments.live
ServerAdmin admin@sentiments.live
DocumentRoot /var/www/html
WSGIDaemonProcess flaskapp threads=5
WSGIScriptAlias / /var/www/html/sentiments/flaskapp.wsgi
<Directory sentiments>
WSGIScriptReloading On
WSGIProcessGroup sentiments
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
</Directory>