Browse Source

Fixed #21443 -- Cannot show debug info on PY3's importlib

Thanks productions@zaziork.co.uk for the review.
Bouke Haarsma 11 years ago
parent
commit
18185724e6
2 changed files with 20 additions and 1 deletions
  1. 4 1
      django/views/debug.py
  2. 16 0
      tests/view_tests/tests/test_debug.py

+ 4 - 1
django/views/debug.py

@@ -388,7 +388,10 @@ class ExceptionReporter(object):
         """
         source = None
         if loader is not None and hasattr(loader, "get_source"):
-            source = loader.get_source(module_name)
+            try:
+                source = loader.get_source(module_name)
+            except ImportError:
+                pass
             if source is not None:
                 source = source.splitlines()
         if source is None:

+ 16 - 0
tests/view_tests/tests/test_debug.py

@@ -19,6 +19,7 @@ from django.test import TestCase, RequestFactory
 from django.test.utils import (override_settings, setup_test_template_loader,
     restore_template_loaders)
 from django.utils.encoding import force_text, force_bytes
+from django.utils import importlib, six
 from django.views.debug import ExceptionReporter
 
 from .. import BrokenException, except_args
@@ -239,6 +240,21 @@ class ExceptionReporterTests(TestCase):
         self.assertIn('<h2>Request information</h2>', html)
         self.assertIn('<p>Request data not supplied</p>', html)
 
+    @skipIf(six.PY2, 'Bug manifests on PY3 only')
+    def test_unfrozen_importlib(self):
+        """
+        importlib is not a frozen app, but its loader thinks it's frozen which
+        results in an ImportError on Python 3. Refs #21443.
+        """
+        try:
+            request = self.rf.get('/test_view/')
+            importlib.import_module('abc.def.invalid.name')
+        except Exception:
+            exc_type, exc_value, tb = sys.exc_info()
+        reporter = ExceptionReporter(request, exc_type, exc_value, tb)
+        html = reporter.get_traceback_html()
+        self.assertIn('<h1>ImportError at /test_view/</h1>', html)
+
 
 class PlainTextReportTests(TestCase):
     rf = RequestFactory()