2015-05-26 5 views
10

Wenn eine Vorlage tief innerhalb des Renderings einer Django-Vorlage fehlt, bekomme ich eine Ausnahme wie unten.Bessere Fehler Nachricht, wenn Vorlage fehlt

Nach sehr langer Suche fand ich den falschen Teil:

{% include form.template_name %} 

form.template_name in meinem Zusammenhang leer war.

Wie kann ich den relevanten Vorlagennamen finden, ohne Stunden zu suchen?

Mir fehlt ein Traceback wie für normalen Python-Code. "Normale" Python-Tracebacks zeigen mir die Datei und die Zeile, die den Fehler enthalten.

/home/foo_fm_d/bin/python /usr/local/pycharm-community-4.5/helpers/pycharm/utrunner.py /home/foo_fm_d/src/foo-time/foo_time/tests/unit/views/user/test_preview_of_next_days.py::EditTestCase::test_preview_of_next_days true 
Testing started at 09:26 ... 

Error 
Traceback (most recent call last): 
    File "/home/foo_fm_d/src/foo-time/foo_time/tests/unit/views/user/test_preview_of_next_days.py", line 11, in test_preview_of_next_days 
    self.admin_client.get(url) 
    File "/home/foo_fm_d/src/djangotools/djangotools/utils/testutils.py", line 275, in get 
    response = super(Client, self).get(path, data, **extra) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/test/client.py", line 473, in get 
    response = super(Client, self).get(path, data=data, **extra) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/test/client.py", line 280, in get 
    return self.request(**r) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/test/client.py", line 444, in request 
    six.reraise(*exc_info) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 137, in get_response 
    response = response.render() 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/response.py", line 105, in render 
    self.content = self.rendered_content 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/response.py", line 82, in rendered_content 
    content = template.render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/base.py", line 140, in render 
    return self._render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/base.py", line 134, in _render 
    return self.nodelist.render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/base.py", line 840, in render 
    bit = self.render_node(node, context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/debug.py", line 78, in render_node 
    return node.render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/loader_tags.py", line 123, in render 
    return compiled_parent._render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/base.py", line 134, in _render 
    return self.nodelist.render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/base.py", line 840, in render 
    bit = self.render_node(node, context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/debug.py", line 78, in render_node 
    return node.render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/loader_tags.py", line 123, in render 
    return compiled_parent._render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/base.py", line 134, in _render 
    return self.nodelist.render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/base.py", line 840, in render 
    bit = self.render_node(node, context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/debug.py", line 78, in render_node 
    return node.render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/loader_tags.py", line 62, in render 
    result = block.nodelist.render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/base.py", line 840, in render 
    bit = self.render_node(node, context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/debug.py", line 78, in render_node 
    return node.render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/debug.py", line 88, in render 
    output = self.filter_expression.resolve(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/base.py", line 585, in resolve 
    obj = self.var.resolve(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/base.py", line 735, in resolve 
    value = self._resolve_lookup(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/base.py", line 789, in _resolve_lookup 
    current = current() 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/loader_tags.py", line 72, in super 
    return mark_safe(self.render(self.context)) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/loader_tags.py", line 62, in render 
    result = block.nodelist.render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/base.py", line 840, in render 
    bit = self.render_node(node, context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/debug.py", line 78, in render_node 
    return node.render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/loader_tags.py", line 62, in render 
    result = block.nodelist.render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/base.py", line 840, in render 
    bit = self.render_node(node, context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/debug.py", line 78, in render_node 
    return node.render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/loader_tags.py", line 62, in render 
    result = block.nodelist.render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/base.py", line 840, in render 
    bit = self.render_node(node, context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/debug.py", line 78, in render_node 
    return node.render(context) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/loader_tags.py", line 166, in render 
    template = get_template(template_name) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/loader.py", line 138, in get_template 
    template, origin = find_template(template_name) 
    File "/home/foo_fm_d/local/lib/python2.7/site-packages/django/template/loader.py", line 131, in find_template 
    raise TemplateDoesNotExist(name) 
TemplateDoesNotExist 


Process finished with exit code 0 

aktualisiert

Mein persönlicher Hintergrund: Bisher ich django Vorlagen vermeiden, da manchmal Ausnahmen stillschweigend ignoriert erhalten und Tracebacks wie dies den Debugging-Prozess, wie das Tragen schwere Schuhe aus Beton fühlen.

Ich versuche, meine Vorurteile loszuwerden. Oder zumindest einen Weg finden, wie man bessere Fehlermeldungen von Vorlagen erhält.

Update II

Ich sehe die Traceback über einen Unittest innerhalb PyCharm. Ich lese das Ergebnis der Ansicht nicht. Der "Webbrowser" Client ruft die Ansicht auf. Ich setze TEMPLATE_DEBUG = True, aber das Ergebnis ist das gleiche.

+0

Haben Sie das versucht: https://docs.djangoproject.com/en/1.8/ref/settings/#template-debug? – Wtower

+0

@Wtower Ich sehe den Traceback über einen Unittest innerhalb von pyCharm. Ich lese das Ergebnis der Ansicht nicht. Der "Webbrowser" 'Client' ruft die Ansicht auf. Ich setze TEMPLATE_DEBUG = True, aber das Ergebnis ist das gleiche. – guettli

+0

Leider 'TEMPLATE_DEBUG = True' beruht auf' DEBUG = True' und diese Variable wird automatisch auf 'False' gesetzt, wenn Tests ausgeführt werden. Könntest du einen echten Server ('./manage.py runserver') laufen lassen und versuchen, ihn im Browser mit' TEMPLATE_DEBUG = DEBUG = True' in deinen Einstellungen zu reproduzieren? – Weier

Antwort

2

ehrlich zu sein, habe ich früher immer die Mechanismen die anderen Plakate mit einem Live-Server vorgeschlagen. Da Sie jedoch nach einer Lösung suchen, die in Jenkins funktionieren könnte und Ihr Stack zeigt, dass Sie debug.py durchgehen, habe ich mir die Debug-Daten dort angesehen.

Ich bemerke, dass die Vorlagen-Engine ein Snippet des Quellcodes für den fehlerhaften Teil der Vorlage im Attribut django_template_source für die Ausnahme hinzufügen sollte.

Ist das in Ihrer Ausnahme vorhanden und hilfreich? Wenn dies der Fall ist, könnten Sie die Ausnahme abfangen und ausdrucken, bevor Sie Ihre UT abbrechen.

+0

Vielen Dank für das sorgfältige Lesen und Verstehen meiner Situation. Ich entwickle Web-Apps, aber wenn ich Backend-Sachen programmiere, benutze ich keinen Webbrowser, schreibe Unit-Tests. Die Django-Debug-Seite ist großartig, aber für fehlgeschlagene Tests nicht sichtbar. Während ich dies schreibe, bekomme ich eine nächste Idee. Vielleicht könnte ich lynx oder w3m starten und die html-Ausgabe der django-Debug-Seite auf ascii ausgeben .... – guettli

+1

Yup - das wäre eine andere Möglichkeit, es zu bekommen, wenn Sie einen Test-Server für Ihre Inhalte starten können. Ein anderer Gedanke: Sie können sich get_traceback_data in https://github.com/django/django/blob/stable/1.6.x/django/views/debug.py für weitere Daten ansehen, die Sie aus der Exception extrahieren können. –

0

Wie Sie verwenden PyCharm scheinen, können Sie den Debugger verwenden, die Sie den Kontext Ihrer Vorlagen (Platz Grenzwerte für das) anzeigen können documentation

Auch, welche Version von Django verwenden Sie? In meiner (1.8 auf python3.4) gibt es keine find_template() in der Datei loader.py. Möglicherweise wurde es aus diesem Grund entfernt?

Btw, TemplateDoesNotExist scheint immer mit dem Namen der Vorlage als param aufgerufen werden, ich denke, dass es in der Fehlermeldung angezeigt werden kann, aber in Ihrem Fall ist es leer. Vielleicht ist es ein weiterer Grund, dass es schwer zu debuggen ist?

+0

Ich liebe Python, da Sie eine Traceback erhalten, wenn etwas nicht stimmt. Aber mit Django Templates bekomme ich Tracebacks wie oben. Ich könnte einen Debugger verwenden, aber eine gute Fehlermeldung beim ersten Lauf ist sehr wichtig. Wenn der Fehler während CI auftritt (wir benutzen jenkins), dann bekomme ich auch nur einen ASCII-Traceback. Wir benutzen Django 1.6 (wir werden bald upgraden) und Python 2.7. – guettli

+0

Ich benutze auch die Traceback als eine erste Möglichkeit, um meine Fehler zu finden, da es viel einfacher und schneller ist, den Debugger zu halten, wenn es nicht klar genug ist oder nicht genug Informationen gibt. Die Vorlagen sind manchmal in diesem Fall. – BriceP

+0

Dank dieser -1, bin ich nicht mehr berechtigt, Antworten zu posten. – BriceP

3

Der Grund, warum Sie den üblichen Python-Stacktrace nicht sehen, ist genau, dass Django-Vorlagen nicht Python sind.

Es ist eine spezielle Sprache, die von Python selbst interpretiert wird, die einen abstrakten Syntaxbaum basierend auf der Vorlage erstellt und diesen Baum dann während der Renderingphase auswertet. Zu diesem Zeitpunkt ist die mit der Quelle verknüpfte Information (z. B. die Vorlagendatei) nicht standardmäßig verfügbar.

Es gibt eine Option innerhalb von Django, um relevantere Informationen zu zeigen, die mit einer Exception verbunden sind, die beim Rendern der Vorlage ausgelöst wurde, es ist TEMPLATE_DEBUG vor DJango 1.8.

Siehe https://docs.djangoproject.com/en/1.8/ref/settings/#template-debug

Diese Option mit Django geändert 1.8 und die Einführung von mehreren Template-Engines als Debug-Informationen sind zu jeder Implementierung von Template-Engine spezifisch.

Edit: Siehe auch What is Django's TEMPLATE_DEBUG setting for?