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

时间:2012-11-23 00:35:37

标签: flask wsgi

有没有人知道如何在任何模块更改时让mod_wsgi自动重新加载Flask应用程序?我试过WSGIScriptReloading On,但没有运气。 official documentation是一种熊......如果没有人知道,我想我会给它一个刺。提前谢谢!

此外,如果它无法在语法错误(例如Flask重新加载器)上永久崩溃,那就太棒了。

6 个答案:

答案 0 :(得分:14)

使用mod_wsgiWSGIScriptReloading会查找.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>