代码更改后自动重新加载python Flask应用


202

我正在研究如何使用Python开发像样的Web应用程序。由于我不希望遇到一些高级结构,因此我选择了轻量级的Flask框架。时间会证明这是否是正确的选择。

因此,现在我已经使用mod_wsgi设置了Apache服务器,并且我的测试站点运行正常。但是,我想通过使我对py或模板文件进行的任何更改自动重新加载网站,从而加快开发流程。我看到站点的.wsgi文件中的任何更改都会导致重新加载(即使在apache配置文件中没有WSGIScriptReloading On的情况下),但我仍然必须手动进行操作(即,插入额外的换行符,保存)。编辑某些应用的py文件时,有什么方法可以引起重新加载?还是希望我使用IDE来刷新.wsgi文件?

Answers:


228

当前推荐的方法是使用flask命令行实用程序。

https://flask.palletsprojects.com/zh-CN/1.1.x/quickstart/#debug-mode

例:

$ export FLASK_APP=main.py
$ export FLASK_ENV=development
$ flask run

或在一个命令中:

$ FLASK_APP=main.py FLASK_ENV=development flask run

如果您想要的端口与默认(5000)添加--port选项不同。

例:

$ FLASK_APP=main.py FLASK_ENV=development flask run --port 8080

更多选项可用于:

$ flask run --help

3
或python3.5中的pyvenv flask run也可以使用,因为当您使用时pip install flask,flask可执行文件也会安装在该venv/bin/文件夹中。
TonyTony

这是一个简单的解决方案,可以转换为Docker进行开发。人们可以在这里看到相同的解决方案。

正常工作正常,但是在带有NTFS分区上代码的Ubuntu上似乎不起作用。代码没有问题,但是flask似乎无法识别该设置中的更改。
citynorman

210

如果您在谈论测试/开发环境,则只需使用debug选项。发生代码更改时,它将自动重新加载flask应用程序。

app.run(debug=True)

或者,从外壳:

$ export FLASK_DEBUG=1
$ flask run

http://flask.pocoo.org/docs/quickstart/#debug-mode


6
仅当您通过内置开发服务器运行站点时,此方法才有效。但不是在Apache上通过wsgi运行它时。我并不一定要真正在Apache上运行它,所以也许您的建议是正确的方法。
2013年

4
正确。在开发环境中,内置服务器的确运行良好,您无需重新发明即可重新加载应用程序。我强烈建议您仅将内置服务器用于开发。目的。无论如何,您都不想在每次代码更改时自动重新加载应用程序。
codegeek

44

在测试/开发环境中

werkzeug调试器已经具有“自动重新加载”功能,可以通过执行以下任一操作来启用该功能:

app.run(debug=True)

要么

app.debug = True

如果需要,还可以使用单独的配置文件来管理所有设置。例如,我将'settings.py'与'DEBUG = True'选项一起使用。导入该文件也很容易。

app.config.from_object('application.settings')

但是,这不适用于生产环境。

生产环境

我个人选择Nginx + uWSGI而不是Apache + mod_wsgi是出于一些性能原因以及配置选项。该触摸重装选项允许你指定一个文件/文件夹会导致uWSGI应用程序重新加载新部署的烧瓶应用。

例如,您的更新脚本会下拉您的最新更改并触摸'reload_me.txt'文件。您的uWSGI ini脚本(由Supervisord保留-显然)在某处包含以下行:

touch-reload = '/opt/virtual_environments/application/reload_me.txt'

我希望这有帮助!


1
感谢您的宝贵建议。我简化了一点。创建一个bash脚本,该脚本在执行时会自行触摸。因此,仅在需要重新加载时才需要启动它。我的解决方案:#touch_me_and_reload.sh touch $ 0
Jabba

@Ewan。触摸重新加载线应该在哪里?[program:uwsig]部分还是[supervisord]部分?
user805981 2015年

@ user805981-都不是,单独的uwsgi配置.ini文件。如果您阅读有关“ touch-reload”的文档,则该文档位于uWSGI中,而不是supervisor配置中。
伊万2015年

谢谢你 app.run(debug=True)失败,但是设置环境变量有效。
阿里

23

如果您正在使用uwsgi运行,请查看python自动重载选项:

uwsgi --py-autoreload 1

示例uwsgi-dev-example.ini:

[uwsgi]
socket = 127.0.0.1:5000
master = true
virtualenv = /Users/xxxx/.virtualenvs/sites_env
chdir = /Users/xxx/site_root
module = site_module:register_debug_server()
callable = app
uid = myuser
chmod-socket = 660
log-date = true
workers = 1
py-autoreload = 1

site_root / __ init__.py

def register_debug_server():
    from werkzeug.debug import DebuggedApplication

    app = Flask(__name__)
    app.debug = True
    app = DebuggedApplication(app, evalex=True)
    return app

然后运行:

uwsgi --ini uwsgi-dev-example.ini

注意:此示例还启用调试器。

我通过Nginx设置尽可能地模仿生产。仅在Nginx后面的内置Web服务器中运行flask应用程序时,就会导致严重的网关错误。


16

Flask 1.0及更高版本的一些更新

热重装的基本方法是:

$ export FLASK_APP=my_application
$ export FLASK_ENV=development
$ flask run
  • 您应该使用FLASK_ENV=development(不是FLASK_DEBUG=1
  • 作为安全检查,您可以运行 flask run --debugger以确保已将其打开
  • Flask CLI现在会自动读取以下内容FLASK_APPFLASK_ENV如果.env项目根目录中文件并且安装了python-dotenv

export FLASK_ENV=development为我工作。 app.run(debug=True)似乎不起作用。
Alex

3

我有一个不同的主意:

第一:

pip install python-dotenv

安装python-dotenv模块,该模块将读取您的项目环境的本地首选项。

第二:

.flaskenv在您的项目目录中添加文件。添加以下代码:

FLASK_ENV=development

完成!

使用Flask项目的此配置,当您运行时flask run,您将在终端中看到以下输出:

在此处输入图片说明

当您编辑文件时,只需保存更改即可。您会看到自动重新加载在那里:

在此处输入图片说明

详细说明:

当然,您可以export FLASK_ENV=development在需要时手动点击。但是使用不同的配置文件来处理实际的工作环境似乎是一个更好的解决方案,因此我强烈建议我使用此方法。


完善!同样,不要忘记将FLASK_APP变量包含到.flaskenv文件中。
塞基尔

2

Flask应用程序可以选择在调试模式下执行。在这种模式下,默认情况下启用了开发服务器的两个非常方便的模块,分别称为重载调试器。启用重新加载器后,Flask会监视项目的所有源代码文件,并在修改任何文件时自动重新启动服务器。

默认情况下,调试模式是禁用的。要启用它,FLASK_DEBUG=1在调用flask之前设置一个环境变量run

(venv) $ export FLASK_APP=hello.py for Windows use > set FLASK_APP=hello.py

(venv) $ export FLASK_DEBUG=1 for Windows use > set FLASK_DEBUG=1

(venv) $ flask run

* Serving Flask app "hello"
* Forcing debug mode on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 273-181-528

在开发过程中,启用启用重新加载程序的服务器非常有用,因为每次修改和保存源文件时,服务器都会自动重新启动并获取更改。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.