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

Auto reloading python Flask app upon code changes

提问人:Passiday 提问时间:5/3/2013 最后编辑:General GrievancePassiday 更新时间:5/31/2023 访问量:347533

问:

我正在研究如何使用 Python 开发一个像样的 Web 应用程序。由于我不想让一些高阶结构妨碍我,所以我的选择落在了轻量级的 Flask 框架上。时间会证明这是否是正确的选择。

所以,现在我已经用mod_wsgi设置了一个Apache服务器,我的测试站点运行良好。但是,我想通过使站点在我所做的 py 或模板文件的任何更改时自动重新加载来加快开发程序。我看到站点的 .wsgi 文件中的任何更改都会导致重新加载(即使 apache 配置文件中没有 WSGIScriptReloading On),但我仍然必须手动推动它(即插入额外的换行符,保存)。有没有办法在我编辑一些应用程序的 py 文件时导致重新加载?或者,我应该使用为我刷新 .wsgi 文件的 IDE?

python Apache 烧瓶

评论


答:

327赞 codegeek 5/3/2013 #1

如果您谈论的是测试/开发环境,那么只需使用 debug 选项即可。当代码发生更改时,它将自动重新加载 flask 应用。

app.run(debug=True)

或者,从 shell 开始:

$ export FLASK_DEBUG=1
$ flask run

http://flask.palletsprojects.com/quickstart/#debug-mode

评论

12赞 Passiday 5/3/2013
仅当您通过内置开发服务器运行站点时,这才有效。但在 Apache 上通过 wsgi 运行它时就不行了。而且我并不坚持我真的需要在Apache上运行它,所以也许你的建议是正确的方法。
4赞 codegeek 5/3/2013
正确。在开发环境中,内置服务器运行良好,您无需重新发明轮子即可重新加载应用程序。我强烈建议您仅使用内置服务器进行开发。无论如何,在 prod 中,您不希望在每次代码更改时自动重新加载应用程序。
0赞 codingbruh 8/31/2022
另一种方法是 flask --app app --debug run
62赞 Ewan 5/4/2013 #2

在测试/开发环境中

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

app.run(debug=True)

app.debug = True

如果需要,您还可以使用单独的配置文件来管理所有设置。例如,我使用带有“DEBUG = True”选项的“settings.py”。导入此文件也很容易;

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

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

生产环境

就我个人而言,我选择了Nginx + uWSGI而不是Apache + mod_wsgi,因为一些性能原因,以及配置选项。touch-reload选项允许你指定一个文件/文件夹,这将导致uWSGI应用程序重新加载你新部署的烧瓶应用程序。

例如,更新脚本会下拉最新更改并触摸“reload_me.txt”文件。你的uWSGI ini脚本(显然是由Supervisord维护的)在某处有这样一行:

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

我希望这会有所帮助!

评论

1赞 Jabba 10/7/2013
谢谢你的好提示。我稍微简化了一下。创建一个在执行时会触及自身的 bash 脚本。因此,您只需要在需要重新加载时启动它。我的解决方案:#touch_me_and_reload.sh触摸$0
0赞 user805981 4/11/2015
@Ewan。触摸重装线应该在哪里?[program:UWSIG] 部分还是 [Supervisord] 部分?
0赞 Ewan 4/11/2015
@user805981- 两者都不是单独的 uwsgi 配置文件。如果你阅读了关于“touch-reload”的文档,它是在uWSGI中,而不是在supervisor配置中。.ini
0赞 Ari 5/8/2019
谢谢你。 失败,但设置环境变量有效。app.run(debug=True)
26赞 Kyle James Walker 11/7/2013 #3

如果您使用 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 应用程序,就会导致错误的网关错误。

530赞 Eyal Levin 10/20/2016 #4

在启用调试模式的情况下运行 CLI 命令,这将自动启用重新加载程序。从 Flask 2.2 开始,您可以在命令行上传递 和 选项。flask run--app--debug

$ flask --app main.py --debug run

--app也可以设置为 或代替 。有关完整说明,请参阅文档。module:appmodule:create_appmodule.py

更多选项可用于:

$ flask run --help

在 Flask 2.2 之前,需要设置 和 环境变量。FLASK_APPFLASK_ENV=development

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

仍然可以在 Flask 2.2 中设置 和 。FLASK_APPFLASK_DEBUG=1

2赞 blue-sky 6/13/2018 #5

要在 PyCharm 中实现此目的,请将“环境变量”部分设置为:

PYTHONUNBUFFERED=1;
FLASK_DEBUG=1

对于 Flask,“运行/调试配置”。

评论

1赞 Tyler Dane 5/29/2020
对于 PyCharm Pro 用户,您可以设置单独的调试配置
21赞 Zach Valenta 9/17/2018 #6

对于 Flask 1.0 到 2.2,热重载的基本方法是:

$ export FLASK_APP=my_application
$ export FLASK_ENV=development
$ flask run

评论

2赞 alex 8/15/2019
export FLASK_ENV=development为我工作。 似乎不起作用。app.run(debug=True)
0赞 Smart Manoj 12/11/2020
@alex奇怪的行为
11赞 Anthonyeef 1/3/2020 #7

我有一个不同的想法:

第一:

pip install python-dotenv

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

第二:

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

FLASK_ENV=development

大功告成!

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

enter image description here

当您编辑文件时,只需保存更改即可。您将看到自动重新加载适合您:

enter image description here

有更多解释:

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

评论

0赞 Cequiel 5/29/2020
完善!另外,不要忘记将变量包含在文件中。FLASK_APP.flaskenv
0赞 Rakib 9/20/2020
这是更整洁、更有用的答案......谢谢
3赞 Asim Fakhi 5/27/2020 #8

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

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

(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

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

9赞 husseinraed 7/14/2020 #9

从终端,您可以简单地说

export FLASK_APP=app_name.py
export FLASK_ENV=development
flask run

或在您的文件中

if __name__ == "__main__":
    app.run(debug=True)

评论

18赞 Rajat Tyagi 10/27/2020 #10
app.run(use_reloader=True)

我们可以使用它,use_reloader因此每次重新加载页面时,我们的代码更改都会更新。

12赞 Anandakrishnan 2/16/2021 #11

使用此方法:

app.run(debug=True)

当代码发生更改时,它将自动重新加载 flask 应用。

示例代码:

from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
   return "Hello World"


if __name__ == '__main__':
  app.run(debug=True)

好吧,如果您想节省时间,而不是在每次发生更改时重新加载网页,那么您可以尝试使用键盘快捷键快速重新加载页面。Ctrl + R

1赞 jeffasante 10/6/2021 #12

为了帮助在浏览器中快速自动更改:

pip install livereload

from livereload import Server

if __name__ == '__main__':
    server = Server(app.wsgi_app)
    server.serve()

接下来,再次启动服务器:

例如。您的文件已 app.py.py

python app.py

6赞 eric xu 11/20/2022 #13

在 flask 2.2 中启用重新加载器:

flask run --reload
0赞 b8con 1/28/2023 #14

我认为更好的解决方案是设置应用程序配置。对我来说,我构建了这个工具,然后将其推送到开发服务器,在那里我必须设置一个 WSGI 管道来管理 flask Web 应用程序。我有一些数据被更新到模板中,我希望它每 X 分钟刷新一次(Flask 站点的 WSGI 部署到 UBUNTU 18 上的APACHE2)。在您的主应用程序或您的主应用程序中,在下面添加字典并标记 ,您会发现服务器上自动更新的任何模板都将反映在浏览器中。Flask 站点上有一些很棒的文档,用于在此处找到配置处理app.pyapp.config.updateTEMPLATES_AUTO_RELOAD=True

app = Flask(__name__)
app.config.update(
    TEMPLATES_AUTO_RELOAD=True
)
2赞 Avinash 5/31/2023 #15

虚拟环境的命令

flask run --debug