Flask 烧瓶+;mod_wsgi在源代码更改时自动重新加载

Flask 烧瓶+;mod_wsgi在源代码更改时自动重新加载,flask,wsgi,Flask,Wsgi,有人知道如何在任何模块发生变化时,使mod_wsgi自动重新加载Flask应用程序吗?我尝试过在上重新加载wsgiscript,但没有成功。这是一种熊。。。如果没人知道,我想我会试试看。提前谢谢 另外,如果它不能在语法错误上永久崩溃(比如烧瓶重新装入器),那就太棒了。你说的“官方文档有点像熊”是什么意思?随附配方有什么问题: 该文档还解释了为什么WSGIScriptReloading没有达到您期望的效果 不,不可能因为语法错误而永久崩溃。它被嵌入到Apache中,Apache的全部目的就是

有人知道如何在任何模块发生变化时,使mod_wsgi自动重新加载Flask应用程序吗?我尝试过在上重新加载wsgiscript,但没有成功。这是一种熊。。。如果没人知道,我想我会试试看。提前谢谢


另外,如果它不能在语法错误上永久崩溃(比如烧瓶重新装入器),那就太棒了。

你说的“官方文档有点像熊”是什么意思?随附配方有什么问题:

该文档还解释了为什么WSGIScriptReloading没有达到您期望的效果

不,不可能因为语法错误而永久崩溃。它被嵌入到Apache中,Apache的全部目的就是让东西保持运行


听起来您不应该使用Apache/mod_wsgi进行开发。每个人都知道不应该在生产中使用自动源代码重新加载,因此无法想象您会想要这样做。

使用
mod_wsgi
WSGIScriptReloading
查找对
.wsgi
配置文件的更改,而不是代码

我的工作流程是上传我的代码更改,然后

$ touch MyWebApp.wsgi
这会导致最后修改的文件时间戳发生更改,并重新加载代码

您可以通过将
.wsgi
文件保存在本地计算机上,然后再次上传,或者我通过SSH进行“远程”操作

对于语法错误,您可以做的不多,代码要么正在运行,要么没有运行,但是一个补丁加上一个
touch
将使它再次运行


如果你是通过FTP工作,你需要注意的一个问题是:确保你最后上传“toucted”
.wsgi
文件,否则它会尝试以错误的代码开始。

我认为在生产中自动重新加载源代码是非常现实的情况。设想一个环境,其中每个版本都部署源,并且“生产”符号链接指向其中一个版本。每当您想要发布一个更新的版本时,您只需将符号链接指向另一个路径。但是apache和mod_wsgi仍然从symlinked目录收集文件,因此需要有一个基于时间戳、大小或w/e的重新加载机制。当然,一个应用程序可能不是问题,但是托管15-20个正在进行积极开发的应用程序怎么样?与每次重新启动apache相比,在这种情况下不自动重新加载源代码是一种纯粹的损失


回到问题上来:如果您使用的框架(在本例中为flask)没有用于自动重新加载源代码的插件或工具,那么Graham和Malphas描述的两个选项是您的最佳选项。触发wsgi进程以重新启动或实现监控系统。

添加WSGIScriptReloading指令是正确的。Flask文档并没有让它100%清晰,但Apache会查找对您的.wsgi文件的更改。推荐的解决方案是,作为发布过程的一部分,只需在.wsgi文件上执行touch命令。

对于生产,我也更喜欢apache mod_wsgi,而对于开发,我使用flask的内置服务器。我分离prod和dev config文件,并在dev config中设置
debug
指令
True
,以便Flask可以自动检测和重新加载代码更改。

这个问题的正确答案是需要将
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>

#ServerName指令设置请求方案、主机名和端口
#服务器使用来标识自身。这在创建时使用
#重定向URL。在虚拟主机的上下文中,服务器名
#指定必须在请求的主机:标头中显示的主机名
#匹配此虚拟主机。对于默认虚拟主机(此文件),此
#该值不是决定性的,因为它被用作最后的宿主。
#但是,必须为任何其他虚拟主机显式设置它。
#服务器名www.example.com
ServerName.live
服务器管理员admin@sentiments.live
DocumentRoot/var/www/html
WSGIDaemonProcess烧瓶应用程序线程数=5
WSGIScriptAlias//var/www/html/感伤/flaskapp.wsgi
WSGIScript正在重新加载
WSGI团体情绪
WSGIApplicationGroup%{GLOBAL}
命令拒绝,允许
通融

我倾向于认为“官方文档有点像熊”只是一种对“RTFM”的抱怨的免责声明。哦,他的意思是,没有人想再花2-3个小时阅读关于自动重新加载源代码的内容了。更重要的是,现在没有人会费心阅读和理解文档了。他们希望人们为他们做研究,解决他们所有的问题。他们没有意识到的是,他们正在破坏可用于帮助的支持网络,因为原始软件包的作者不再为帮助用户而烦恼,因为用户不想首先尝试帮助自己。应该注意的是,您所说的仅适用于mod_wsgi守护进程模式。@GrahamDumpleton这是一个您认为mod_wsgi的工作流是可以接受的吗?如果您不能轻松地重新启动Apache web服务器本身,这是最简单的方法。谢谢,这很有效。现在,我在本地开发时保持运行:
$while true;触摸MyWebApp.wsgi;睡眠1;完成
(每秒循环触摸文件)@GrahamDumpleton如何在守护程序模式下运行它?这不是默认的吗?请考虑使用MODYWSGI- Exchange进行开发。查看我的博客,查看最近关于它的帖子,并寻找更多关于它的帖子