Opened 7 years ago

Closed 3 years ago

#27827 closed Cleanup/optimization (fixed)

Raising InvalidTemplateLibrary completely masks out real exception in get_package_libraries

Reported by: Kehinde Adewusi Owned by: Jacob Walls
Component: Template system Version: dev
Severity: Normal Keywords: debugging
Cc: Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

Summary
In django/template/backends/django.py, function get_package_libraries on line 119 completely masks out the ImportError and raises InvalidTemplateLibrary. This makes it incredibly difficult to debug application issues.
Probably better not to handle the exception in the first place since it only raises another type and inner exception looses the stack trace.

To reproduce
Create two apps e.g. form_utils and reports.
Write a template tag in reports e.g. reports.templatetags.report_tags. (reports/templatetags/report_tags.py
Add a simple module in form_utils e.g. widgets.py.
In widgets.py, import a none-existent module e.g. from django.forms.util import flatatt (was removed in > django 1.4)
import form_utils.widget in report_tags e.g. from form_utils.widgets import CalendarWidget
A quick way to reproduce the error would be to register some models with admin and navigate to /admin

The following error will be raised in get_package_libraries:

InvalidTemplateLibrary at /admin/login/

Invalid template library specified. ImportError raised when trying to load 'reports.templatetags.report_tags': No module named util

Request Method: GET
Request URL: http://localhost:2017/admin/login/?next=/admin/
Django Version: 1.10.1
Exception Type: InvalidTemplateLibrary
Exception Value:
Invalid template library specified. ImportError raised when trying to load 'reports.templatetags.report_tags': No module named util
Exception Location: D:\repo\django110\lib\site-packages\django\template\backends\django.py in get_package_libraries, line 130

However, if the exception was not caught and "wrongly" re-raised as an InvalidTemplateLibrary, the following errors would be printed:

ImportError at /admin/login/
No module named util
Request Method: GET
Request URL: http://localhost:2017/admin/login/?next=/admin/
Django Version: 1.10.1
Exception Type: ImportError
Exception Value:
No module named util
Exception Location: D:\repo\projects\evincehr\apps\form_utils\widgets.py in <module>, line 3

The second behavior is more appropriate to debugging the error and the error would be quickly found.

Attachments (2)

bad_error_message.png (164.0 KB ) - added by Kehinde Adewusi 7 years ago.
Invalid error message.
good_error_message.png (143.3 KB ) - added by Kehinde Adewusi 7 years ago.
good error message.

Download all attachments as: .zip

Change History (5)

by Kehinde Adewusi, 7 years ago

Attachment: bad_error_message.png added

Invalid error message.

by Kehinde Adewusi, 7 years ago

Attachment: good_error_message.png added

good error message.

comment:1 by Tim Graham, 7 years ago

Component: Error reportingTemplate system
Owner: set to nobody
Triage Stage: UnreviewedAccepted

I'm not sure if the "helpful" message added in 655f52491505932ef04264de2bce21a03f3a7cd0 must be removed, but since master only supports Python 3, there's an opportunity to use Python 3 exception chaining, e.g. raise InvalidTemplateLibrary(...) from e.

comment:2 by Jacob Walls, 3 years ago

Has patch: set
Owner: changed from nobody to Jacob Walls
Status: newassigned
Version: 1.10master

This PR re-raises the exception from the original instance of an ImportError.

PR

comment:3 by Mariusz Felisiak <felisiak.mariusz@…>, 3 years ago

Resolution: fixed
Status: assignedclosed

In 89fc144:

Fixed #27827 -- Used "raise from" when raising InvalidTemplateLibrary exceptions in get_package_libraries().

This change sets the cause attribute to raised exceptions and makes
small cleanups in error messages.

Note: See TracTickets for help on using tickets.
Back to Top