2013-01-11 43 views
7

我想在使用Jinja2的python中創建一個html模板。我有一個模板文件夾與我的'template.html',但我不知道如何處理環境或包裝載。使用Jinja2的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 

回答

8

PackageLoader預計使用常規點語法實際Python模塊。例如,如果你的結構是這樣的:

myapp/ 
    __init__.py 
    … 
    templates/ 
    mytemplate.html 

您應該使用myapp作爲模塊名。

env = Environment(loader=PackageLoader('scriptname', 
             templatesPath)) 

哪裏這段代碼到文件scriptname.py

+0

您可以留空。請參閱http://docs.python.org/2/tutorial/modules.html#packages – patrys

+0

哦,非常感謝! – pombo

8

我用下面的代碼解決了這個問題。

我不確定我的答案是否相關,但我想知道也許有人可能會發現這個答案有用。如果我錯了,請告訴我。

+1

包加載程序調用'scriptname.py'。如果你在那裏初始化包裝載器,代碼將被第二次調用。 – Henrik

8

如果你不想要或需要一個Python包,你應該使用FileSystemLoader代替,就像這樣:

from jinja2 import Environment, FileSystemLoader, select_autoescape 
env = Environment(
    loader=FileSystemLoader('file/path/'), 
    autoescape=select_autoescape(['html', 'xml']), 
) 
1

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

這讓我們注意到st ructure這樣的:

myapp/ 
    __init__.py 
    ... 
    templates/ 
    mytemplate.html 

將有相同PackageLoader實例與這兩個聲明:

PackageLoader('myapp') 
PackageLoader('myapp', 'templates') 

所以,如果你是從myapp/路徑運行,然後只需要說:

PackageLoader('templates', '') 

因此,它將只需要templates/作爲路徑。如果您將第二個參數留空,它將嘗試在templates/templates中查找模板。

最後,你可以查閱一下已經通過list_templates()方法加載:

PackageLoader('templates', '').list_templates()