默认情况下,使用内置服务器(Flask.run)运行Flask应用程序时,它会监视其Python文件并在代码更改时自动重新加载该应用程序:
Flask.run
* Detected change in '/home/xion/hello-world/app.py', reloading * Restarting with reloader
不幸的是,这似乎仅适用于* .py文件,而且我似乎没有找到任何将此功能扩展到其他文件的方法。最值得注意的是,当模板更改时,让Flask重新启动应用程序将非常有用。我已经迷失了多少次我不喜欢模板中的标记,却因为看不到任何更改而感到困惑,只是发现该应用程序仍在使用旧版本的Jinja模板。
因此,有没有办法在模板目录中包含Flask监视文件,还是需要深入研究框架的源代码?
编辑:我正在使用Ubuntu 10.10。尚未在任何其他平台上尝试过。
经过进一步的查询,我发现模板中的更改确实是实时更新的,而无需重新加载应用程序本身。但是,这似乎仅适用于传递给的模板flask.render_template。
flask.render_template
但是碰巧的是,在我的应用程序中,我在Jinja模板中使用了很多可重用的,参数化的组件。它们以{% macro %}s 实现,驻留在专用的“模块”中,并{% import %}编入实际页面。不错,而且很干…除了那些导入的模板显然从未检查过修改,因为它们根本没有通过render_template。
{% macro %}s
{% import %}
render_template
(奇怪的是,对于通过调用的模板,这种情况不会发生{% extends %}。至于{% include %},由于不真正使用它们,我不知道。)
{% extends %}
{% include %}
因此,总结起来,这种现象的根源似乎在Jinja和Flask或Werkzeug之间。我想对于其中的任何一个项目,都可能需要进行bug跟踪:)同时,我已经接受了jd。的答案,因为这是我实际使用的解决方案-它的工作原理就像一种魅力。
以我的经验,模板甚至不需要重新启动应用程序即可刷新,因为每次render_template()调用时都应从磁盘加载模板。也许你的模板使用方式有所不同。
render_template()
要在模板更改(或任何其他文件)时重新加载应用程序,可以将extra_files参数传递给Flask().run(),以观察文件名的集合:对这些文件的任何更改都将触发重新加载器。
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
是否检查模板源的修改并自动重新加载。默认情况下,该值为None,这意味着Flask仅在调试模式下检查原始文件。