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

So, now I've set up an Apache server with mod_wsgi, and my test site is running fine. However, I'd like to speed up the development routine by making the site automatically reload upon any changes in py or template files I make. I see that any changes in site's .wsgi file causes reloading (even without WSGIScriptReloading On in the apache config file), but I still have to prod it manually (ie, insert extra linebreak, save). Is there some way how to cause reload when I edit some of the app's py files? Or, I am expected to use IDE that refreshes the .wsgi file for me?


当前回答

如果你正在使用uwsgi运行,看看python的auto reload选项:

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设置尽可能地模拟生产过程。简单地运行flask应用程序,在nginx后面的web服务器中,它会导致一个糟糕的网关错误。

其他回答

在开启调试模式的情况下运行flask Run CLI命令,将自动启用reloader。从Flask 2.2开始,你可以在命令行上传递——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=开发环境变量。

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

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

对于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现在会自动读取FLASK_APP和FLASK_ENV之类的东西,如果你在项目根目录中有一个.env文件,并且安装了python-dotenv

I believe a better solution is to set the app configuration. For me, I built the tool and then pushed it to a development server where I had to set up a WSGI pipeline to manage the flask web app. I had some data being updated to a template and I wanted it to refresh every X minutes (WSGI deployment for the Flask site through APACHE2 on UBUNTU 18). In your app.py or whatever your main app is, add app.config.update dictionary below and mark TEMPLATES_AUTO_RELOAD=True, you will find that any templates that are automatically updated on the server will be reflected in the browser. There is some great documentation on the Flask site for configuration handling found here.

app = Flask(__name__)
app.config.update(
    TEMPLATES_AUTO_RELOAD=True
)

如果你正在使用uwsgi运行,看看python的auto reload选项:

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设置尽可能地模拟生产过程。简单地运行flask应用程序,在nginx后面的web服务器中,它会导致一个糟糕的网关错误。

在终端上你可以简单地说

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

或者在你的文件中

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