Opened 8 years ago
Closed 4 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)
Change History (5)
by , 8 years ago
Attachment: | bad_error_message.png added |
---|
comment:1 by , 8 years ago
Component: | Error reporting → Template system |
---|---|
Owner: | set to |
Triage Stage: | Unreviewed → Accepted |
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 , 4 years ago
Has patch: | set |
---|---|
Owner: | changed from | to
Status: | new → assigned |
Version: | 1.10 → master |
This PR re-raises the exception from the original instance of an ImportError
.
Invalid error message.