2013-01-11 6 views
7

Próbuję utworzyć szablon html w python za pomocą Jinja2. Mam folder szablonów z moim "template.html", ale nie wiem, jak radzić sobie ze środowiskami lub ładowarkami pakietów.HTML szablon za pomocą Jinja2 - Lost

Zainstalowałem aplikację Jinja2 za pomocą easy_python i uruchomiłem następujący skrypt.

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

Otrzymuję następujący błąd, ponieważ nie wiem, jak zdefiniować pakiet/moduł. Proszę, pomóżcie mi, chcę tylko stworzyć prosty szablon.

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 

Odpowiedz

8

PackageLoader oczekuje rzeczywistej modułu Pythona przy użyciu zwykłej składni kropka. Na przykład, jeśli struktura wygląda następująco:

myapp/ 
    __init__.py 
    … 
    templates/ 
    mytemplate.html 

powinien użyć myapp jako nazwa modułu.

+0

Możesz zostawić to pole puste. Zobacz http://docs.python.org/2/tutorial/modules.html#packages – patrys

+0

Oh wielkie dzięki! – pombo

8

I rozwiązać ten problem za pomocą następującego kodu:

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

gdzie ten kod jest w pliku scriptname.py.

Nie jestem pewien, czy moja odpowiedź jest istotna, ale zastanawiałem się, że być może ktoś może uznać tę odpowiedź za przydatną. Jeśli się mylę, daj mi znać.

+1

Pakiety ładujące wywołania 'scriptname.py'. Jeśli zainicjujesz tam program ładujący pakiet, kod zostanie wywołany po raz drugi. – Henrik

8

Jeśli nie chcą lub muszą pakiet Pythona, prawdopodobnie należy używać FileSystemLoader zamiast, jak to:

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

PackageLoader jest zdefiniowany następująco:

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

a następnie __init__() Metoda jest następująca:

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

To powoduje, że zauważamy, że ructure tak:

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

będą miały taką samą PackageLoader wystąpienie z obu tych deklaracji:

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

a więc jeśli używasz ze ścieżki myapp/, następnie wystarczy powiedzieć:

PackageLoader('templates', '') 

Tak, że po prostu zajmie templates/ jako ścieżkę. Jeśli pozostawisz drugi argument pusty, spróbuje znaleźć szablony w templates/templates.

Wreszcie, można sprawdzić co został załadowany za pomocą metody list_templates():

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