将静态文件直接插入到Jinja模板中而不进行解析

时间:2012-03-19 09:20:20

标签: python jinja2

我正在尝试使用include标记使用Jinja 2.6将文件插入到页面中。这工作正常,直到我开始在文件中使用让人联想到Jinja语法的字符,此时它意识到它无法解析它们并遭到轰炸。

除了浏览文件并转义所有字符外,我该怎么做才能告诉Jinja只是按原样包含文件?

5 个答案:

答案 0 :(得分:18)

您可以定义一个函数来加载文本文件并在模板中呈现它:

import jinja2

def include_file(name):
    return jinja2.Markup(loader.get_source(env, name)[0])

loader = jinja2.PackageLoader(__name__, 'templates')
env = jinja2.Environment(loader=loader)
env.globals['include_file'] = include_file

def render():
    return env.get_template('page.html').render()

if __name__ == '__main__':
    print render()

在模板中,将其命名为:

{{ include_file('file.txt') }}

答案 1 :(得分:9)

如果您使用的是Flask,可以这样写:

from jinja2 import Markup

...

app.jinja_env.globals['include_raw'] = lambda filename : Markup(app.jinja_loader.get_source(app.jinja_env, filename)[0])

并像这样使用:

{{ include_raw('js-inline/modernizr.min.js') }}

包含文件的路径与正常包含的模板文件夹相关。

答案 2 :(得分:4)

尝试将语法放在{% raw %} {% endraw %}

中的其他文件中

如果您不想编辑外部文件,可以使用jQuery: 跳转以包含内容<div id="contentoffile"></div>

并使用jquery加载文件:$("#contentoffile").load("url to file")&lt;&lt;网址可以是相对的

答案 3 :(得分:1)

作为对@ Alex答案的更新,您可以使用Jinja的@contextfunction装饰器来消除对全局变量的依赖。更新的代码如下所示:

import jinja2                                                                                                                                                                                                  

@jinja.contextfunction                                                                                                                                                                                         
def include_file(ctx, name):                                                                                                                                                                                   
    env = ctx.environment                                                                                                                                                                                      
    return jinja2.Markup(env.loader.get_source(env, name)[0])                                                                                                                                                  


def main():                                                                                                                                                                                                    
    loader = jinja2.PackageLoader(__name__, 'templates')                                                                                                                                                       
    env = jinja2.Environment(loader=loader)                                                                                                                                                                    
    env.globals['include_file'] = include_file                                                                                                                                                                 

    env.get_template('page.html').render()                                                                                                                                                                     


if __name__ == '__main__':                                                                                                                                                                                     
    print main()

和以前一样,从你的模板中调用它,如:

{{ include_file('file.txt') }}

答案 4 :(得分:0)

这里是标记形式的解决方案,在编写模板时,它看起来更像标准的“ include”。

from jinja2 import nodes
from jinja2.ext import Extension
from jinja2 import Markup


class IncludeRawExtension(Extension):
    tags = {"include_raw"}

    def parse(self, parser):
        lineno = parser.stream.expect("name:include_raw").lineno
        filename = nodes.Const(parser.parse_expression().value)
        result = self.call_method("_render", [filename], lineno=lineno)
        return nodes.Output([result], lineno=lineno)

    def _render(self, filename):
        return Markup(self.environment.loader.get_source(self.environment, filename)[0])

# Use the extension when setting up Jinja
your_jinja_env = jinja2.Environment(
    extensions=[IncludeRawExtension],
)

从功能上讲,它与这里的其他答案相同,但我认为与常规的“ include”标记保持相同的{%语法会有所帮助。

{% include "template.html" %}
{% include_raw "template.html" %}