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

Python 模板文件更改时重新加载Flask应用程序,python,flask,jinja2,Python,Flask,Jinja2,默认情况下,当使用内置服务器(Flask.run)运行Flask应用程序时,它会监视其Python文件,并在其代码更改时自动重新加载应用程序: * Detected change in '/home/xion/hello-world/app.py', reloading * Restarting with reloader 不幸的是,这似乎只适用于*.py文件,我似乎找不到任何方法将此功能扩展到其他文件。最值得注意的是,当模板发生更改时,让Flask重新启动应用程序将非常有用。我已经记不清有多

默认情况下,当使用内置服务器(
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\u template
的模板

但碰巧在我的应用程序中,我有很多可重用的、参数化的组件,我在Jinja模板中使用这些组件。它们被实现为
{%macro%}
s,驻留在专用的“模块”中,并被
{%import%}
嵌入到实际页面中。一切都很好,很干燥。。。除了那些导入的模板显然从未检查过修改,因为它们根本不通过
render\u template

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


总而言之,这一现象的根源似乎在金贾和烧瓶或Werkzeug之间。我想这可能会让我有理由去bug tracker了解其中任何一个项目:)同时,我接受了jd的答案,因为这就是我实际使用的解决方案,而且它的工作方式很有魅力。

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

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

要在模板更改(或任何其他文件)时重新加载应用程序,可以将
extra_files
参数传递到
Flask().run()
,一组要监视的文件名:这些文件上的任何更改都将触发重新加载程序

例如:

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)
请参见此处:

您可以使用

TEMPLATES_AUTO_RELOAD = True

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


实际上,对我来说,
TEMPLATES\u AUTO\u RELOAD=True
不起作用(0.12版本)。我使用jinja2和我所做的:

  • 在请求之前创建函数

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

    app.before_request(before_request)
    
  • 就这样


  • 对我有效的是添加以下内容:

    @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的答案)

    使用
    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')
    

    使用FLASK_ENV=development

    对我来说效果很好:

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

    有关截至2021年3月更新的

    的更多信息,请参见:

    建议通过app.run()运行dev服务器,因此如果要使用CLI,则无法使用接受的解决方案

    在Flask 1.1或更高版本中,环境变量
    Flask\u RUN\u EXTRA\u FILES
    或选项
    --EXTRA FILES
    有效地执行与接受答案相同的操作。另见

    用法示例:

    flask run——额外文件“app/templates/index.html”
    #或
    导出FLASK\u RUN\u EXTRA\u FILES=“app/templates/index.html”
    烧瓶运行
    
    在Linux中。要指定多个额外文件,请使用冒号分隔文件路径,例如

    export FLASK\u RUN\u EXTRA\u FILES=“app/templates/index.html:app/templates/other.html”
    
    还支持整个目录:

    flask运行--附加文件应用程序/模板/
    
    模板会自动重新加载,为什么不执行
    ctrl+f5
    刷新网页,
    导致web浏览器通常保存缓存。

    要在服务器上重新加载应用程序,我在浏览器中使用了
    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\u files
    参数或
    TEMPLATES\u AUTO\u RELOAD
    config将其重新加载到服务器上,但为了在不损坏键盘F5键的情况下获得流畅的开发体验,我会选择
    livereload

    确保应用程序配置为DEBUG=True,请参阅。好东西!我承认我错过了
    Flask.run
    文档中的链接,这导致了Werkzeug文档。但是这个特别的选项似乎足够有用,至少在Flask文档中提到了它。如果任何人遇到一个错误,说
    没有这样的文件或目录
    ,请尝试使用相对路径,如:
    extra_dirs=['./directory/to/watch'.]
    如果你也对
    路径
    感到困惑,那么它就是
    os.path
    。认为更改静态文件后自动重新加载是值得一提的。请参阅。知道如何在从命令行运行
    flask run
    时指定额外文件吗?此解决方案是传统的,有文档支持,易于理解,易于实现。应该接受!我尝试了这个答案,但只成功了一次,在再次刷新后,它不会成功,只是给别人一个提示:I