模板文件更改时重新加载Flask应用程序

时间:2012-03-01 00:00:04

标签: python flask jinja2

默认情况下,当使用内置服务器(Flask.run)运行Flask应用程序时,它会监视其Python文件并在代码更改时自动重新加载应用程序:

* Detected change in '/home/xion/hello-world/app.py', reloading
* Restarting with reloader

不幸的是,这似乎仅适用于 *。py 文件,我似乎没有找到任何方法将此功能扩展到其他文件。最值得注意的是,当模板更改时,让Flask重新启动应用程序非常有用。我已经不知道有多少次我在模板中摆弄标记并且因为没有看到任何变化而感到困惑,只是发现应用程序仍在使用旧版本的Jinja模板。

那么,有没有办法让Flask监控文件存放在 templates 目录中,还是需要深入到框架的源代码?

编辑:我正在使用Ubuntu 10.10。没有在任何其他平台上尝试过。


经过进一步调查后,我发现模板中的更改确实实时更新,而无需重新加载应用程序本身。但是,这似乎仅适用于传递给flask.render_template的模板。

但实际上,在我的应用程序中,我有很多可重复使用的参数化组件,我在Jinja模板中使用它们。它们实现为{% macro %} s,驻留在专用“模块”中,并{% import %}编入实际页面。所有不错和DRY ...除了那些导入的模板显然从未检查过修改,因为它们根本没有通过render_template

(奇怪的是,对于通过{% extends %}调用的模板不会发生这种情况。至于{% include %},我不知道因为我没有真正使用它们。)

总而言之,这种现象的根源似乎介于Jinja和Flask或Werkzeug之间。我想这可能需要为这些项目中的任何一个项目追踪错误跟踪器:)同时,我接受了 jd。的答案,因为这是我实际使用的解决方案 - 它就像一个魅力

11 个答案:

答案 0 :(得分:101)

你可以使用

TEMPLATES_AUTO_RELOAD = True

来自http://flask.pocoo.org/docs/1.0/config/

  

是否检查模板源的修改并自动重新加载。默认情况下,该值为None,这意味着Flask仅在调试模式下检查原始文件。

答案 1 :(得分:52)

根据我的经验,模板甚至不需要重新启动应用程序来刷新,因为每次调用render_template()时都应该从磁盘加载它们。也许您的模板使用方式不同。

要在模板更改时重新加载应用程序(或任何其他文件),您可以将extra_files参数传递给Flask().run(),这是要监视的文件名集合:对这些文件的任何更改都将触发reloader。

示例:

from os import path, walk

extra_dirs = ['directory/to/watch',]
extra_files = extra_dirs[:]
for extra_dir in extra_dirs:
    for dirname, dirs, files in walk(extra_dir):
        for filename in files:
            filename = path.join(dirname, filename)
            if path.isfile(filename):
                extra_files.append(filename)
app.run(extra_files=extra_files)

见这里:http://werkzeug.pocoo.org/docs/0.10/serving/?highlight=run_simple#werkzeug.serving.run_simple

答案 2 :(得分:36)

使用jinja模板时,需要设置一些参数。在我使用python3的情况下,我使用以下代码解决了它:

if __name__ == '__main__':
    app.jinja_env.auto_reload = True
    app.config['TEMPLATES_AUTO_RELOAD'] = True
    app.run(debug=True, host='0.0.0.0')

答案 3 :(得分:7)

实际上对我来说TEMPLATES_AUTO_RELOAD = True不起作用(0.12版本)。我使用jinja2和我所做的:

  1. 创建函数before_request

    def before_request():
        app.jinja_env.cache = {}
    
  2. 在应用程序中注册

    app.before_request(before_request)
    
  3. 就是这样。

答案 4 :(得分:4)

对我有用的只是添加:

@app.before_request
def before_request():
    # When you import jinja2 macros, they get cached which is annoying for local
    # development, so wipe the cache every request.
    if 'localhost' in request.host_url or '0.0.0.0' in request.host_url:
        app.jinja_env.cache = {}

取自@ dikkini' s

答案 5 :(得分:2)

在Windows上使用最新版本的Flask,使用run命令并将debug设置为true;无需重置Flask即可更改要生效的模板。尝试按Shift + F5(或Shift加上重新加载按钮)以确保没有缓存任何内容。

答案 6 :(得分:2)

对我来说效果很好:

 from flask import Flask, render_template, request, url_for, redirect
 app = Flask(__name__)
 app.config["TEMPLATES_AUTO_RELOAD"] = True

有关http://flask.pocoo.org/docs/1.0/config/的更多信息

答案 7 :(得分:1)

模板会自动重新加载,为什么不ctrl+f5来刷新网页, 导致网络浏览器通常保存缓存。

答案 8 :(得分:1)

为了在服务器和浏览器中重新加载应用程序,我使用了 livereload 包。通过 CLI 安装

$ pip install livereload

并运行代码

from flask import Flask, render_template

app = Flask(__name__)

@app.route("/")
def hello():
    return render_template("index.html")

if __name__ == '__main__':
    from livereload import Server
    server = Server(app.wsgi_app)
    server.serve(host = '0.0.0.0',port=5000)

此处的所有答案都使用 extra_files 参数或 TEMPLATES_AUTO_RELOAD 配置重新加载到服务器上,但为了在不损坏键盘 F5 键的情况下获得流畅的开发体验,我会选择 livereload

答案 9 :(得分:0)

请参见http://flask.pocoo.org/docs/1.0/quickstart/ 并使用FLASK_ENV=development

答案 10 :(得分:0)

自2019年6月起更新:

推荐使用this github issue而不是app.run()来运行开发服务器,因此,如果我们要使用CLI,则无法使用接受的解决方案。

在撰写本文时,使用Flask(1.1)的开发版本可以使我们设置环境变量FLASK_RUN_EXTRA_FILES,该变量实际上与接受的答案具有相同的作用。

请参见{{3}}。

用法示例:

export FLASK_RUN_EXTRA_FILES="app/templates/index.html"
flask run
在Linux中

要指定多个其他文件,请用冒号分隔文件路径。,例如

export FLASK_RUN_EXTRA_FILES="app/templates/index.html:app/templates/other.html"

从Flask 1.1开始,CLI还支持--extra-files参数。