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

Python 将静态文件直接插入Jinja模板,而不进行解析,python,jinja2,Python,Jinja2,我正在尝试使用jinja2.6使用include标记将文件插入页面。在我开始在文件中使用让人联想到Jinja语法的字符之前,这一切都很好。在这一点上,它意识到它无法解析这些字符,并对它们进行了轰炸 除了遍历文件并转义所有字符外,我能做些什么来告诉Jinja只按原样包含文件?尝试将语法放入{%raw%}{%endraw%}{/code> 如果不想编辑外部文件,可以使用jQuery: 跳转以包含内容 并使用jquery加载文件:$(“#contentoffile”)。加载(“url到文件”)您可以定

我正在尝试使用jinja2.6使用
include
标记将文件插入页面。在我开始在文件中使用让人联想到Jinja语法的字符之前,这一切都很好。在这一点上,它意识到它无法解析这些字符,并对它们进行了轰炸


除了遍历文件并转义所有字符外,我能做些什么来告诉Jinja只按原样包含文件?

尝试将语法放入
{%raw%}{%endraw%}{/code>

如果不想编辑外部文件,可以使用jQuery: 跳转以包含内容


并使用jquery加载文件:
$(“#contentoffile”)。加载(“url到文件”)
您可以定义一个函数来加载文本文件并在模板中呈现它:

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

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

{{ include_file('file.txt') }}
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') }}
使用方法如下:

{{ include_file('file.txt') }}
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') }}

与普通包含一样,包含文件的路径是相对于模板文件夹的。

作为对@Alex答案的更新,您可以使用Jinja的decorator删除对全局变量的一些依赖。更新后的代码如下所示:

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

这里有一个标签形式的解决方案,它看起来更像是编写模板时的标准“include”

来自jinja2导入节点的

从jinja2.ext导入扩展
从jinja2导入标记
类别包括扩展(扩展):
标记={“include_raw”}
def parse(self,parser):
lineno=parser.stream.expect(“名称:include_raw”).lineno
filename=nodes.Const(parser.parse_expression().value)
result=self.call_方法(“_render”,[filename],lineno=lineno)
返回nodes.Output([result],lineno=lineno)
def_渲染(自身,文件名):
返回标记(self.environment.loader.get_源(self.environment,filename)[0])
#设置Jinja时使用扩展名
您的_jinja_env=jinja2.环境(
扩展=[包括扩展],
)
从功能上讲,它与这里的其他答案相同,但我认为它有助于保持与常规“include”标记相同的
{%
语法

{%include“template.html”%}
{%include_raw“template.html”%}

这是可行的,但关键是我不想修改包含的文件。它们是外部文件,正在其他地方使用。感谢ajax提示……不过,我正试图避免额外的请求。我不明白为什么在呈现模板时,文件就在那里,我还需要进行另一次往返。为了澄清,外部文件是一组在多个地方使用的mustache javascript模板。我不想修改它们,只想将它们作为HTML源代码包含在内。谢谢……我希望有一个内置的方法或插件我错过了,但我会继续。嗨,Alex,我在使用代码时没有得到输出,因为使用某些参数是未定义的。”(loader.get_source(env,name)”您能详细解释一下吗?如果
file.txt
位于
templates
目录的父目录中,我该如何包含
{include_file('../file.txt')}的内容呢
返回错误
jinja2.exceptions.TemplateNotFound:../file.txt
。但是您没有从方法传递'ctx'参数?!?装饰程序提供了它。
@contextfunction
装饰程序。当我调用函数时,它会抛出一个错误,作为所需的另一个参数…请注意,您不能在templates目录外搜索。如果您确实需要退出,则必须将模板目录设置在路径的更高位置,或者使用自定义Jinja加载程序向模板搜索路径添加更多内容。