我正在尝试使用Jinja2在python中创建一个html模板。我有一个带有'template.html'的模板文件夹,但我不知道如何处理环境或包装加载器。
我使用easy_python安装了Jinja2并运行了以下脚本。
from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('yourapplication', 'templates'))
template = env.get_template('mytemplate.html')
print template.render()
我收到以下错误,因为我不知道如何定义包/模块。请帮帮我,我只是想创建一个简单的模板。
File "log_manipulationLL.py", line 291, in <module>
env = Environment(loader=PackageLoader('yourapplication', 'templates'))
File "/usr/local/lib/python2.7/dist-packages/Jinja2-2.6-py2.7.egg/jinja2/loaders.py", line 216, in __init__
provider = get_provider(package_name)
File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 213, in get_provider
__import__(moduleOrReq)
ImportError: No module named yourapplication
答案 0 :(得分:9)
如果您不想要或不需要Python软件包,您可能应该使用FileSystemLoader代替,如下所示:
from jinja2 import Environment, FileSystemLoader, select_autoescape
env = Environment(
loader=FileSystemLoader('file/path/'),
autoescape=select_autoescape(['html', 'xml']),
)
答案 1 :(得分:8)
PackageLoader
期望使用常规点语法的实际Python模块。例如,如果您的结构如下所示:
myapp/
__init__.py
…
templates/
mytemplate.html
您应该使用myapp
作为模块名称。
答案 2 :(得分:8)
我使用以下代码解决了这个问题:
env = Environment(loader=PackageLoader('scriptname',
templatesPath))
此代码放在文件scriptname.py
中。
我不确定我的答案是否相关,但我想知道也许有人可能会觉得这个答案很有用。如果我错了,请告诉我。
答案 3 :(得分:2)
PackageLoader的定义如下:
class PackageLoader(BaseLoader):
"""Load templates from python eggs or packages. It is constructed with
the name of the python package and the path to the templates in that
package::
loader = PackageLoader('mypackage', 'views')
If the package path is not given, ``'templates'`` is assumed.
Per default the template encoding is ``'utf-8'`` which can be changed
by setting the `encoding` parameter to something else. Due to the nature
of eggs it's only possible to reload templates if the package was loaded
from the file system and not a zip file.
"""
然后__init__()
方法如下:
def __init__(self, package_name, package_path='templates',
encoding='utf-8'):
这让我们注意到这样的结构:
myapp/
__init__.py
...
templates/
mytemplate.html
这两个声明将具有相同的PackageLoader
实例:
PackageLoader('myapp')
PackageLoader('myapp', 'templates')
因此,如果您从myapp/
路径开始运行,那么您只需要说:
PackageLoader('templates', '')
因此它只需要templates/
作为路径。如果您将第二个参数留空,它将尝试在templates/templates
中找到模板。
最后,您可以使用list_templates()
方法检查已加载的内容:
PackageLoader('templates', '').list_templates()