首页 文章

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

提问于
浏览
57

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

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

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

那么,有没有办法让Flask监控文件存在于模板目录中,还是需要潜入框架的源代码?

Edit :我真的在其他任何平台上试过这个 .


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

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

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

总而言之,这种现象的根源似乎介于Jinja和Flask或Werkzeug之间 . 我想这可能需要为这些项目之一的bug追踪器旅行:)同时,我已经接受了jd . 's answer because that'是我实际使用的解决方案 - 它就像一个魅力 .

7 回答

  • 7

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

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

    例:

    from os import path
    
    extra_dirs = ['directory/to/watch',]
    extra_files = extra_dirs[:]
    for extra_dir in extra_dirs:
        for dirname, dirs, files in os.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

  • 4

    您可以使用

    TEMPLATES_AUTO_RELOAD = True
    

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

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

  • 32

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

    实际上对我来说 TEMPLATES_AUTO_RELOAD = True 不起作用(0.12版本) . 我使用jinja2和我做了什么:

    • 创建功能 before_request
    def before_request():
        app.jinja_env.cache = {}
    
    • 在应用程序中注册
    app.before_request(before_request)
    
    • 就是这样 .
  • 0

    对我有用的只是添加:

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

  • 1

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

  • 86

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

相关问题