提问人:Passiday 提问时间:5/3/2013 最后编辑:General GrievancePassiday 更新时间:5/31/2023 访问量:347533
代码更改时自动重新加载 python Flask 应用
Auto reloading python Flask app upon code changes
问:
我正在研究如何使用 Python 开发一个像样的 Web 应用程序。由于我不想让一些高阶结构妨碍我,所以我的选择落在了轻量级的 Flask 框架上。时间会证明这是否是正确的选择。
所以,现在我已经用mod_wsgi设置了一个Apache服务器,我的测试站点运行良好。但是,我想通过使站点在我所做的 py 或模板文件的任何更改时自动重新加载来加快开发程序。我看到站点的 .wsgi 文件中的任何更改都会导致重新加载(即使 apache 配置文件中没有 WSGIScriptReloading On),但我仍然必须手动推动它(即插入额外的换行符,保存)。有没有办法在我编辑一些应用程序的 py 文件时导致重新加载?或者,我应该使用为我刷新 .wsgi 文件的 IDE?
答:
如果您谈论的是测试/开发环境,那么只需使用 debug 选项即可。当代码发生更改时,它将自动重新加载 flask 应用。
app.run(debug=True)
或者,从 shell 开始:
$ export FLASK_DEBUG=1
$ flask run
http://flask.palletsprojects.com/quickstart/#debug-mode
评论
在测试/开发环境中
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'
我希望这会有所帮助!
评论
.ini
app.run(debug=True)
如果您使用 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 应用程序,就会导致错误的网关错误。
在启用调试模式的情况下运行 CLI 命令,这将自动启用重新加载程序。从 Flask 2.2 开始,您可以在命令行上传递 和 选项。flask run
--app
--debug
$ flask --app main.py --debug run
--app
也可以设置为 或代替 。有关完整说明,请参阅文档。module:app
module:create_app
module.py
更多选项可用于:
$ flask run --help
在 Flask 2.2 之前,需要设置 和 环境变量。FLASK_APP
FLASK_ENV=development
$ export FLASK_APP=main.py
$ export FLASK_ENV=development
$ flask run
仍然可以在 Flask 2.2 中设置 和 。FLASK_APP
FLASK_DEBUG=1
要在 PyCharm 中实现此目的,请将“环境变量”部分设置为:
PYTHONUNBUFFERED=1;
FLASK_DEBUG=1
对于 Flask,“运行/调试配置”。
评论
对于 Flask 1.0 到 2.2,热重载的基本方法是:
$ export FLASK_APP=my_application
$ export FLASK_ENV=development
$ flask run
- 您应该使用(不是
FLASK_ENV=development
FLASK_DEBUG=1
) - 作为安全检查,您可以运行以确保它已打开
flask run --debugger
- Flask CLI 现在会自动读取诸如 和 如果您在项目根目录中有一个
.env
文件并安装了 python-dotenv 之类的内容FLASK_APP
FLASK_ENV
评论
export FLASK_ENV=development
为我工作。 似乎不起作用。app.run(debug=True)
我有一个不同的想法:
第一:
pip install python-dotenv
安装模块,该模块将读取项目环境的本地首选项。python-dotenv
第二:
在项目目录中添加文件。添加以下代码:.flaskenv
FLASK_ENV=development
大功告成!
使用 Flask 项目的此配置,当您运行时,您将在终端中看到以下输出:flask run
当您编辑文件时,只需保存更改即可。您将看到自动重新加载适合您:
有更多解释:
当然,您可以在每次需要时手动点击。但是使用不同的配置文件来处理实际的工作环境似乎是一个更好的解决方案,所以我强烈推荐我使用的这种方法。export FLASK_ENV=development
评论
FLASK_APP
.flaskenv
可以选择在调试模式下执行 Flask 应用程序。在此模式下,默认情况下会启用开发服务器的两个非常方便的模块,称为重新加载器和调试器。 启用重新加载器后,Flask 会监视项目的所有源代码文件,并在修改任何文件时自动重启服务器。
默认情况下,调试模式处于禁用状态。要启用它,请在调用 flask 之前设置一个环境变量:FLASK_DEBUG=1
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
在开发过程中,让服务器在启用重新加载程序的情况下运行非常有用,因为每次修改和保存源文件时,服务器都会自动重新启动并选取更改。
从终端,您可以简单地说
export FLASK_APP=app_name.py
export FLASK_ENV=development
flask run
或在您的文件中
if __name__ == "__main__":
app.run(debug=True)
评论
app.run(use_reloader=True)
我们可以使用它,use_reloader因此每次重新加载页面时,我们的代码更改都会更新。
使用此方法:
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
为了帮助在浏览器中快速自动更改:
pip install livereload
from livereload import Server
if __name__ == '__main__':
server = Server(app.wsgi_app)
server.serve()
接下来,再次启动服务器:
例如。您的文件已 app.py.py
python app.py
在 flask 2.2 中启用重新加载器:
flask run --reload
我认为更好的解决方案是设置应用程序配置。对我来说,我构建了这个工具,然后将其推送到开发服务器,在那里我必须设置一个 WSGI 管道来管理 flask Web 应用程序。我有一些数据被更新到模板中,我希望它每 X 分钟刷新一次(Flask 站点的 WSGI 部署到 UBUNTU 18 上的APACHE2)。在您的主应用程序或您的主应用程序中,在下面添加字典并标记 ,您会发现服务器上自动更新的任何模板都将反映在浏览器中。Flask 站点上有一些很棒的文档,用于在此处找到配置处理。app.py
app.config.update
TEMPLATES_AUTO_RELOAD=True
app = Flask(__name__)
app.config.update(
TEMPLATES_AUTO_RELOAD=True
)
虚拟环境的命令
flask run --debug
评论