首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >模板文件更改时重新加载Flask应用程序

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

Stack Overflow用户
提问于 2012-03-01 08:00:04
回答 12查看 109.5K关注 0票数 113

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

代码语言:javascript
复制
* Detected change in '/home/xion/hello-world/app.py', reloading
* Restarting with reloader

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

那么,有没有办法让Flask监控模板目录中的文件,或者需要深入研究框架的源代码?

编辑:我使用的是Ubuntu10.10。实际上,我还没有在任何其他平台上尝试过。

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

但碰巧在我的应用程序中,我有相当多的可重用的、参数化的组件,我在Jinja模板中使用它们。它们被实现为模块,驻留在专用的“模块”中,并被{% import %}到实际的页面中。一切都干干净净的。除了那些导入的模板显然从来没有检查过修改,因为它们根本不通过render_template

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

因此,总结一下,这种现象的根源似乎位于金佳和Flask或Werkzeug之间的某个地方。同时,我接受了jd的回答,因为这就是我实际使用的解决方案--而且它的效果很不错。

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2012-03-01 14:31:13

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

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

示例:

代码语言:javascript
复制
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)

查看此处:http://werkzeug.pocoo.org/docs/0.10/serving/?highlight=run_simple#werkzeug.serving.run_simple

票数 77
EN

Stack Overflow用户

发布于 2016-07-14 18:14:20

您可以使用

代码语言:javascript
复制
TEMPLATES_AUTO_RELOAD = True

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

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

票数 174
EN

Stack Overflow用户

发布于 2017-04-25 17:30:20

使用jinja模板时,需要设置一些参数。在我使用python3的情况下,我用以下代码解决了这个问题:

代码语言:javascript
复制
if __name__ == '__main__':
    app.jinja_env.auto_reload = True
    app.config['TEMPLATES_AUTO_RELOAD'] = True
    app.run(debug=True, host='0.0.0.0')
票数 63
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9508667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档