Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.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 Jinja2:渲染模板继承?_Python_Extend_Jinja2 - Fatal编程技术网

Python Jinja2:渲染模板继承?

Python Jinja2:渲染模板继承?,python,extend,jinja2,Python,Extend,Jinja2,我想使用模板呈现融合的Jinja2和降价页面,如下所示: {% block title %}{{ title }}{% endblock %} # {{ title[0] }} # {{ title[1] }} ## Introduction 我可以使用上面的代码来生成HTML,但是由于我将此脚本用于自定义创作应用程序,我希望能够为每种类型的条目定义主模板 当我试图通过扩展主模板来呈现上面的页面时,template.html: {% extends 'template.html' %}

我想使用模板呈现融合的Jinja2和降价页面,如下所示:

{% block title %}{{ title }}{% endblock %}

# {{ title[0] }}
# {{ title[1] }}

## Introduction
我可以使用上面的代码来生成HTML,但是由于我将此脚本用于自定义创作应用程序,我希望能够为每种类型的条目定义主模板

当我试图通过扩展主模板来呈现上面的页面时,
template.html

{% extends 'template.html' %}

{% block title %}{{ title }}{% endblock %}

# {{ title[0] }}
# {{ title[1] }}

## Introduction
我得到一个错误:

Traceback (most recent call last):
  File "compiler.py", line 55, in <module>
    template = Template(text).render(parser.vars)
  File "/usr/lib/python2.7/site-packages/jinja2/environment.py", line 891, in render
    return self.environment.handle_exception(exc_info, True)
  File "<template>", line 1, in top-level template code
TypeError: no loader for this environment specified
回溯(最近一次呼叫最后一次):
文件“compiler.py”,第55行,在
template=template(text).render(parser.vars)
文件“/usr/lib/python2.7/site packages/jinja2/environment.py”,第891行,在渲染中
返回self.environment.handle\u异常(exc\u info,True)
文件“”,第1行,顶层模板代码
TypeError:未指定此环境的加载程序
您可以看到有问题的行是
template=template(text).render(parser.vars)


是否有任何方法可以渲染上述模板代码并能够扩展
template.html

Jinja的渲染器需要知道如何加载
template.html
,因此您需要为
环境
提供一个模板加载程序实例

例如,假设文件
page.html
template.html
位于当前目录中:

from jinja import FileSystemLoader
from jinja.environment import Environment

env = Environment()
env.loader = FileSystemLoader('.')
tmpl = env.get_template('page.html')
print tmpl.render(parser.vars)

已更新-您可以创建自定义模板加载程序,或使用中定义的现有类之一。例如,
DictLoader
将在
dict()
实例中查找
template.html
,并将该值视为模板数据。从任何地方(例如memcache、mysql、redis、Python对象等)加载模板都应该很简单

使用
DictLoader
的示例:

pages = ('template.html', 'page.html')
templates = dict((name, open(name, 'rb').read()) for name in pages)
env.loader = DictLoader(templates)
page.html

{% extends "template.html" %}

哇,谢谢!我是被迫将模板保存到文本文件中,还是
get\u template
可以使用字符串输入?我会再看一遍文档的……不客气!我用Jinja的模板加载器更新了我的答案。我使用的是
DictLoader
,但是回溯非常奇怪:
jinja2.exceptions.TemplateNotFound:(我的模板HTML在这里)
。我通常定义
dict
{'templates/article.html':'…',…}
,但它只有在我将其反转时才被读取。什么…?嗯,
DictLoader
适合我(我在本地更改了我的示例,它可以工作)。您确定您使用的路径正确吗?例如,
{%extends“name.html”%}
中使用的路径是否与字典键完全匹配?您的意思是来自jinja*2*…?