在模板文件更改时重新装载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_files
parameter 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和我做了什么:
-
创build函数
before_request
def before_request(): app.jinja_env.cache = {}
-
在应用程序中注册
app.before_request(before_request)
-
DEBUG和TESTING以及TEMPLATES_AUTO_RELOAD选项
app.config.update( DEBUG=True, TESTING=True, TEMPLATES_AUTO_RELOAD=True )
-
而已。
什么对我来说只是添加这个:
@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。