2013-01-11 21 views
7

Ich versuche, eine HTML-Vorlage in Python mit Jinja2 zu erstellen. Ich habe einen Templates-Ordner mit meiner 'template.html', aber ich weiß nicht, wie ich mit Umgebungen oder Paketladern umgehen soll.HTML Templating mit Jinja2 - Lost

Ich installierte Jinja2 mit easy_python und führte das folgende Skript.

from jinja2 import Environment, PackageLoader 
env = Environment(loader=PackageLoader('yourapplication', 'templates')) 
template = env.get_template('mytemplate.html') 
print template.render() 

Ich bekomme den folgenden Fehler, weil ich nicht weiß, wie man ein Paket/Modul definiert. Bitte helfen Sie mir, ich möchte nur eine einfache Vorlage erstellen.

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 

Antwort

8

PackageLoader erwartet einen tatsächlichen Python Modul die regelmäßige Punkt Syntax. Zum Beispiel, wenn Ihre Struktur sieht wie folgt aus:

myapp/ 
    __init__.py 
    … 
    templates/ 
    mytemplate.html 

Sie myapp als Modulnamen verwenden soll.

+0

Sie können es leer lassen. Siehe http://docs.python.org/2/tutorial/modules.html#packages – patrys

+0

Oh vielen Dank! – pombo

8

Ich löste dieses Problem mit dem folgenden Code:

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

wo dieser Code in die Datei scriptname.py ist.

Ich bin mir nicht sicher, ob meine Antwort relevant ist, aber ich habe mich gefragt, ob vielleicht jemand diese Antwort nützlich finden könnte. Wenn ich falsch liege, lass es mich wissen.

+1

Der Paketlader ruft 'scriptname.py' auf. Wenn Sie den Paketlader dort initialisieren, wird der Code ein zweites Mal aufgerufen. – Henrik

8

Wenn Sie nicht über ein Python-Paket wollen oder müssen, sollten Sie vielleicht einen FileSystemLoader stattdessen verwenden, wie folgt aus:

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. 
    """ 

Und dann:

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

PackageLoader wie folgt definiert ist __init__() Methode ist wie folgt:

def __init__(self, package_name, package_path='templates', 
      encoding='utf-8'): 

Diese uns, dass eine st bemerken macht ructure wie folgt aus:

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

Und so, wenn Sie aus dem myapp/ Weg laufen, Sie brauchen dann nur zu sagen:

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

die gleiche PackageLoader Instanz mit diesen beiden Erklärungen haben Will

PackageLoader('templates', '') 

So dass es nur templates/ als Pfad dauert. Wenn Sie das zweite Argument leer lassen, wird es versuchen, die Vorlagen in zu finden.

Schließlich können Sie überprüfen, welche unter Verwendung des list_templates() Methode geladen wurde:

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