Python 烧瓶-蓝图中的Jinja环境魔法
在jinja模板中时:Python 烧瓶-蓝图中的Jinja环境魔法,python,flask,Python,Flask,在jinja模板中时: 如何解析提供给{%extends xxx_string%}和{%include xxx_string%}的字符串 这是相对于实际的文件系统,还是相对于生成的名称空间(例如,当使用Flask.url_作为函数时) 最后,我希望在模板中使用相对导入(我不想更新每个模板中与蓝图相关的文件系统位置)。我希望能够: 将实际Blueprint包及其嵌套的静态/模板资源存储在任意文件系统路径下。(“/bob/projects/2013_07/marketanalysis”) 在pyth
url\u的快捷方式)
我已经把这个问题尖锐化了不少。我认为这是这个主题应该达到的程度。在我看来,使用文件夹而不是前缀可以让它更干净一些。示例应用程序结构:
yourapplication
|- bp143
|- templates
|- bp143
|- index.jinja
|- quiz.jinja
|- context.jinja
|- templates
|- base.jinja
|- index.jinja
|- bp143
|- context.jinja
使用上述结构,您可以参考以下模板:
base.jinja --> comes from the application package
index.jinja --> comes from the application package
bp143/index.jinja --> comes from the blueprint
bp143/context.jinja --> comes from the application package (the app overrides the template of the same name in the blueprint)
显式加载模板使用。。。(未测试) 根据每个视图的需要手动加载这些模板。我相信这可以清理多个视图,但我相信这是预期的行为
我不确定您是否可以
{%extend context\u kword\u key%}
,但它应该适用于嵌入式includes()/imports()。似乎我的“资源绑定”最合适的解决方案应该使用Jinja加载程序处理(请参阅)。马上,jinja2.PackageLoader
,jinja2.PrefixLoader
,和jinja2.DictLoader看起来很有趣
对于这一点,公认的答案给出了如何在烧瓶中处理装载机的概念。在大多数情况下,我们可以不使用默认的应用程序级别DispatchingJinjaLoader
默认情况下,我相信一个蓝图将以它的self.jinja_加载程序结束
jinja2.FileSystemLoader(os.path.join(self.root_path,
self.template_folder))
这有助于我们理解默认解析算法有多简单,以及扩展特定于Blueprint的函数有多容易。子类/自定义加载程序的巧妙组合将让我们创建更智能的加载程序,并允许我们潜入一些帮助我们作弊的魔法
真正的力量将来自覆盖CustomBaseLoader.list_templates()和一个连接到应用程序DispatcherJinjaLoader的快速小ProxyLoader,它将优先于正常查找。这确实有点帮助,但我仍然必须在includes/imports上引用模板中的脏路径。我想我希望我可以在文件系统上移动文件夹,这样他们就可以插入到新的位置,而无需进一步努力。
jinja2.FileSystemLoader(os.path.join(self.root_path,
self.template_folder))