Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 烧瓶-蓝图中的Jinja环境魔法_Python_Flask - Fatal编程技术网

Python 烧瓶-蓝图中的Jinja环境魔法

Python 烧瓶-蓝图中的Jinja环境魔法,python,flask,Python,Flask,在jinja模板中时: 如何解析提供给{%extends xxx_string%}和{%include xxx_string%}的字符串 这是相对于实际的文件系统,还是相对于生成的名称空间(例如,当使用Flask.url_作为函数时) 最后,我希望在模板中使用相对导入(我不想更新每个模板中与蓝图相关的文件系统位置)。我希望能够: 将实际Blueprint包及其嵌套的静态/模板资源存储在任意文件系统路径下。(“/bob/projects/2013_07/marketanalysis”) 在pyth

在jinja模板中时:

  • 如何解析提供给{%extends xxx_string%}和{%include xxx_string%}的字符串
  • 这是相对于实际的文件系统,还是相对于生成的名称空间(例如,当使用Flask.url_作为函数时)
  • 最后,我希望在模板中使用相对导入(我不想更新每个模板中与蓝图相关的文件系统位置)。我希望能够:

  • 将实际Blueprint包及其嵌套的静态/模板资源存储在任意文件系统路径下。(“/bob/projects/2013_07/marketanalysis”)
  • 在python Blueprint包中,定义一个单独的“slugname”来引用Blueprint实例及其所有资源。在应用程序上注册此名称以进行全局引用。(无全局名称冲突或竞争条件)
  • 根据蓝图的使用方式(标题、封面、简介、完整故事、引文),具有提供“饼干刀”布局的通用视图功能
  • 在内部,在blueprint包的文件系统中,在解析模板内的extends()/include()时使用相对路径名(类似于引用相对blueprint视图时的
    url\u的
    快捷方式)
  • 其想法是,当blueprint包与其所有资源捆绑在一起时,它不知道将在何处部署它,并且可能会在不同的slug名称下多次重新定位。python接口对于每个“bundle”都应该是相同的,但是html内容、css、javascript和图像/下载对于每个bundle都是唯一的



    我已经把这个问题尖锐化了不少。我认为这是这个主题应该达到的程度。

    在我看来,使用文件夹而不是前缀可以让它更干净一些。示例应用程序结构:

    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))