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

Pas*_*day 153 python apache flask web

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

所以,现在我已经设置了一个带有mod_wsgi的Apache服务器,我的测试站点运行正常.但是,我想通过在我制作的py或模板文件中的任何更改时自动重新加载网站来加速开发例程.我看到网站的.wsgi文件中的任何更改都会导致重新加载(即使没有在apache配置文件中使用WSGIScriptReloading),但我仍然需要手动生成它(即插入额外的换行符,保存).当我编辑一些应用程序的py文件时,有什么方法可以导致重新加载吗?或者,我应该使用IDE为我刷新.wsgi文件?

cod*_*eek 186

如果您正在讨论测试/开发环境,那么只需使用调试选项即可.当代码发生变化时,它会自动重新加载烧瓶app.

app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)

或者,从shell:

$ export FLASK_DEBUG=1
$ flask run
Run Code Online (Sandbox Code Playgroud)

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

  • 仅当您通过内置开发服务器运行站点时,此方法才有效.但不是在Apache上通过wsgi运行时.而且我并不坚持我真的需要在Apache上运行它,所以也许你建议的是正确的方法. (6认同)
  • 正确.在开发环境中,内置服务器运行良好,您无需重新发明轮子以重新加载应用程序.我强烈建议你只使用dev的内置服务器.目的.无论如何,在prod中,您不希望在每次代码更改时自动重新加载应用程序. (3认同)

Eya*_*vin 165

当前推荐的方式(Flask> = 0.11)与flask命令行实用程序一起使用.

http://flask.pocoo.org/docs/0.11/server/

例:

$ export FLASK_APP=main.py
$ export FLASK_ENV=development
$ flask run
Run Code Online (Sandbox Code Playgroud)

或者在一个命令中:

$ FLASK_APP=main.py FLASK_ENV=development flask run
Run Code Online (Sandbox Code Playgroud)

我更喜欢5000而不是--port因为前者也适用flask.

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

例:

$ FLASK_APP=main.py FLASK_ENV=development flask run --port 8080
Run Code Online (Sandbox Code Playgroud)

有更多选项可供选择:

$ flask run --help
Run Code Online (Sandbox Code Playgroud)

  • 或者python3.5中的pyvenv,`flask run`也可以工作,因为当你'pip install flask`时,一个烧瓶可执行文件也安装在`venv/bin /`文件夹中. (3认同)
  • 正常情况下工作得很好,但这似乎不适用于 Ubuntu 上的 NTFS 分区上的代码。代码没有问题,但 Flask 似乎无法识别该设置中的更改。 (2认同)

Ewa*_*wan 39

在测试/开发环境中

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

app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)

要么

app.debug = True
Run Code Online (Sandbox Code Playgroud)

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

app.config.from_object('application.settings')
Run Code Online (Sandbox Code Playgroud)

但是,这不适合生产环境.

生产环境

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

例如,您的更新脚本会提取最新的更改并触及"reload_me.txt"文件.你的uWSGI ini脚本(由Supervisord保留 - 显然)在这里有这一行:

touch-reload = '/opt/virtual_environments/application/reload_me.txt'
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助!


Kyl*_*ker 21

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

uwsgi --py-autoreload 1
Run Code Online (Sandbox Code Playgroud)

示例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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

然后运行:

uwsgi --ini uwsgi-dev-example.ini
Run Code Online (Sandbox Code Playgroud)

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

我使用我的nginx设置尽可能接近模仿生产.只需运行烧录应用程序,它内置在nginx后面的Web服务器,就会导致错误的网关错误.


Zac*_*nta 12

A few updates for Flask 1.0

basic approach to hot re-loading is:

$ export FLASK_APP=my_application
$ export FLASK_ENV=development
$ flask run
Run Code Online (Sandbox Code Playgroud)

  • `export FLASK_ENV=development` 对我有用。`app.run(debug=True)` 似乎不起作用。 (2认同)

Ana*_*nan 12

使用这个方法:

app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)

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

示例代码:

from flask import Flask

app = Flask(__name__)

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


if __name__ == '__main__':
  app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)

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


小智 9

从终端你可以简单地说

export FLASK_APP=app_name.py
export FLASK_ENV=development
flask run
Run Code Online (Sandbox Code Playgroud)

或者在你的文件中

if __name__ == "__main__":
    app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)


小智 9

app.run(use_reloader=True)
Run Code Online (Sandbox Code Playgroud)

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


Ant*_*eef 6

我有了不同的想法:

第一的:

pip install python-dotenv
Run Code Online (Sandbox Code Playgroud)

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

第二:

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

FLASK_ENV=development
Run Code Online (Sandbox Code Playgroud)

完成!

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

在此处输入图片说明

当您编辑文件时,只需保存更改即可。你会看到自动重新加载是为你准备的:

在此处输入图片说明

更多解释:

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


小智 6

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

flask run --reload
Run Code Online (Sandbox Code Playgroud)