2010-01-04 26 views
20

Używam systemu szablonów jinja2 w django. Jest naprawdę szybki i bardzo mi się podoba. Mam jednak pewien problem z szablonami do debugowania: Jeśli popełniam błędy w szablonie (zły znacznik, zła nazwa pliku, zły koniec bloku ...), nie mam w ogóle informacji o tym błędzie.Jak debugować szablon Jinja2?

Na przykład w widoku django, piszę to:

from jinja2 import Environment, PackageLoader 
env = Environment(loader=PackageLoader('main', 'templates')) 

def jinja(req): 
    template = env.get_template('jinja.html') 
    output=template.render(myvar='hello') 
    return HttpResponse(output) 

napisać szablon jinja2: jinja.html:

{{myvar|notexistingfilter()}} Jinja ! 

Wskazówki, kładę na celu non istniejący filtr wygenerować błąd:

Spodziewałem się czegoś takiego jak "notexistingfilter() not defined", ale dostałem tylko proste czarne na białym traceback (nie zwykły komunikat debugowania django):

Traceback (most recent call last): 

    File "/usr/local/lib/python2.6/dist-packages/django/core/servers/basehttp.py", line 279, in run 

    self.result = application(self.environ, self.start_response) 

    File "/usr/local/lib/python2.6/dist-packages/django/core/servers/basehttp.py", line 651, in __call__ 
    return self.application(environ, start_response) 


    File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/wsgi.py", line 241, in __call__ 
    response = self.get_response(request) 

    File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/base.py", line 134, in get_response 

    return self.handle_uncaught_exception(request, resolver, exc_info) 

    File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/base.py", line 154, in handle_uncaught_exception 
    return debug.technical_500_response(request, *exc_info) 


    File "/usr/local/lib/python2.6/dist-packages/django/views/debug.py", line 40, in technical_500_response 
    html = reporter.get_traceback_html() 

    File "/usr/local/lib/python2.6/dist-packages/django/views/debug.py", line 84, in get_traceback_html 

    self.get_template_exception_info() 

    File "/usr/local/lib/python2.6/dist-packages/django/views/debug.py", line 117, in get_template_exception_info 
    origin, (start, end) = self.exc_value.source 



TypeError: 'Template' object is not iterable 

Nie otrzymam nazwy pliku szablonu, w którym wystąpił błąd, brak informacji o samym błędzie, więc bardzo trudno jest debugować jinja2.

Co należy zrobić, aby uzyskać więcej informacji na temat debugowania i dowiedzieć się, gdzie znajduje się błąd w szablonie jinja2?

Dziękuję z góry,

+0

Dlaczego nie używasz szablonów Django? Są prawie takie same jak Jinja2 i otrzymujesz prawdziwe komunikaty o błędach. Czemu po prostu nie wrócić do szablonów Django? –

+0

W dolnej części tego przepisu znajduje się kilka sugestii, dlaczego należy używać Jinja2 zamiast szablonów Django: http://appengine-cookbook.appspot.com/recipe/upgrade-the-django-templating-system-to-jinja2/ –

+3

@S. Lott moje doświadczenie było takie, że szablony Django nie były niczym w stylu Jinja. Szablony Django zmusiły mnie do oddzielenia obliczeń i logiki od szablonów/prezentacji. To był ogromny ból w tyłku, kiedy chciałem zrobić coś w stylu, powiedzmy, wywołać funkcję obiektu z argumentami. Jestem za dobrym szablonem, ale nie zmuszam go przez paraliżowanie systemu szablonów, zachęcanie go dobrym projektem tego systemu i dobrą dokumentacją najlepszych praktyk. –

Odpowiedz

16

Po wykonaniu testu trochę więcej, znalazłem odpowiedź:

Robiąc ten sam test szablonu, bezpośrednio pod python, bez użycia Django komunikaty debugowania są obecne. Więc pochodzi od django.

Poprawka jest w pliku settings.py: Trzeba ustawić DEBUG na True i ustawić TEMPLATE_DEBUG na False.

+0

Czy ta odpowiedź jest łatwa do Google? Odniosłem się do jednego lub dwóch różnych samouczków dotyczących konfiguracji Jinji z Django i nigdzie nie pamiętam tego. Cieszę się, że wreszcie dostaję komunikaty o błędach Jinji! –

+0

@Eric możesz wybrać własną odpowiedź jako odpowiedź na swoje pytanie. – OozeMeister

6

Z dokumentacji Jinja2:

Moi tracebacks wyglądać dziwnie. Co się dzieje?

Jeśli moduł przyspieszeń nie jest skompilowany i korzystasz z instalacji Pythona bez ctypów (Python 2.4 bez ctypów, Jython lub Google AppEngine) Jinja2 nie może podać poprawnych informacji na temat debugowania i może być niekompletne. Obecnie nie ma dobrego obejścia dla Jython lub AppEngine, ponieważ ctypes jest tam niedostępny i nie można używać rozszerzenia speedups.

http://jinja.pocoo.org/2/documentation/faq#my-tracebacks-look-weird-what-s-happening

+0

Dziękuję za odpowiedź. Zanim zadałem moje pytanie, zrekompilowałem jinja2 z modułem speedups. Używam pakietu debian dla Pythona, więc myślę, że nie jestem w tym przypadku ... Mam nadzieję. Jak sprawdzić Ubuntu używane ctypes w swoim pakiecie Pythona? – Eric