问题:代码更改后自动重新加载python Flask应用
我正在研究如何使用Python开发像样的Web应用程序。由于我不希望遇到一些高级结构,因此我选择了轻量级的Flask框架。时间会证明这是否是正确的选择。
因此,现在我已经使用mod_wsgi设置了Apache服务器,并且我的测试站点运行正常。但是,我想通过使我对py或模板文件进行的任何更改自动重新加载网站,从而加快开发流程。我看到站点的.wsgi文件中的任何更改都会导致重新加载(即使在apache配置文件中没有WSGIScriptReloading On的情况下),但我仍然必须手动进行操作(即,插入额外的换行符,保存)。编辑某些应用的py文件时,有什么方法可以引起重新加载?还是希望我使用IDE来刷新.wsgi文件?
回答 0
当前推荐的方法是使用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
回答 1
如果您在谈论测试/开发环境,则只需使用debug选项。发生代码更改时,它将自动重新加载flask应用程序。
app.run(debug=True)
或者,从外壳:
$ export FLASK_DEBUG=1
$ flask run
回答 2
在测试/开发环境中
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'
我希望这有帮助!
回答 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应用程序时,就会导致严重的网关错误。
回答 4
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_APP
,FLASK_ENV
如果.env
项目根目录中有文件并且安装了python-dotenv
回答 5
我有一个不同的主意:
第一:
pip install python-dotenv
安装python-dotenv
模块,该模块将读取您的项目环境的本地首选项。
第二:
.flaskenv
在您的项目目录中添加文件。添加以下代码:
FLASK_ENV=development
完成!
使用Flask项目的此配置,当您运行时flask run
,您将在终端中看到以下输出:
当您编辑文件时,只需保存更改即可。您会看到自动重新加载在那里:
详细说明:
当然,您可以export FLASK_ENV=development
在需要时手动点击。但是使用不同的配置文件来处理实际的工作环境似乎是一个更好的解决方案,因此我强烈建议我使用此方法。
回答 6
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
在开发过程中,启用启用重新加载程序的服务器非常有用,因为每次修改和保存源文件时,服务器都会自动重新启动并获取更改。
回答 7
要在PyCharm中实现这一目标,请将“环境变量”部分设置为:
PYTHONUNBUFFERED=1;
FLASK_DEBUG=1
对于Flask的“运行/调试配置”。