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

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

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

不幸的是,这似乎只适用于* .py文件,而且我似乎没有find任何方法将此function扩展到其他文件。 最值得注意的是,当模板更改时,Flask重启应用将非常有用。 我已经失去了多less次在模板中弄乱了标记,并且因为没有看到任何改变而感到困惑,只是发现应用程序仍然使用旧版本的Jinja模板。

那么,有没有一种方法可以在模板目录中使用Flask监视器文件,还是需要跳入框架的源代码?

编辑 :我使用Ubuntu 10.10。 还没有尝试过,在任何其他平台真的。


经过进一步的调查,我发现模板的变化实际上实时更新的,无需重新加载应用程序本身。 但是,这似乎只适用于传递给flask.render_template模板。

但是恰巧在我的应用程序中,我有很多可重用的参数化组件,我在Jinja模板中使用。 它们被实现为{% macro %} ,驻留在专用的“模块”中,并被{% import %}到实际的页面中。 所有漂亮和干燥…除了那些导入的模板显然从来没有检查修改,因为他们根本不通过render_template

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

所以这个现象的根源似乎在于Jinja和Flask或者Werkzeug之间。 我想这可能需要为这些项目之一的bug追踪器:)同时,我接受了jd。 因为这是我实际使用的解决scheme – 它的作用就像一个魅力。

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

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

例:

 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

你可以使用TEMPLATES_AUTO_RELOAD = True

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

是否检查模板源的修改并自动重新加载。 默认情况下,值为None,表示Flask只在debugging模式下检查原始文件。

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

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

  1. 创build函数before_request

    def before_request(): app.jinja_env.cache = {}

  2. 在应用程序中注册

    app.before_request(before_request)

  3. DEBUG和TESTING以及TEMPLATES_AUTO_RELOAD选项

    app.config.update( DEBUG=True, TESTING=True, TEMPLATES_AUTO_RELOAD=True )

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

在Windows上使用最新版本的Flask,使用运行命令和debugging设置为true; Flask不需要重新设置,以便更改要引入的模板。 尝试Shift + F5(或Shift加上重新加载button),以确保它没有被caching。