Opened 4 years ago

Closed 4 years ago

#31166 closed Cleanup/optimization (fixed)

Provide context for ImproperlyConfigured exceptions in URL resolver.

Reported by: Ram Rachum Owned by: Ram Rachum
Component: Core (URLs) Version: dev
Severity: Normal Keywords:
Cc: Shai Berger Triage Stage: Ready for checkin
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

The patch is ready here: https://github.com/django/django/pull/12263

This will make it have a text of "this exception is the direct result of" instead of "During handling of the above exception, another exception occurred"

This is more accurate for the case of this exception.

If this change will be merged, there are a couple more place in this module where it can be added.

When it happened to me a few weeks ago, it was due to a circular import, which I then fixed. Now of course, when I tried to reproduce the circular import to show you, I couldn't. But I could achieve the same thing by renaming urlpatterns to xurlpatterns, so it wouldn't be available. This is the error I get:

Exception in thread django-main-thread:
Traceback (most recent call last):
  File "C:\Program Files\Python38\lib\site-packages\django\urls\resolvers.py", line 590, in url_patterns
    iter(patterns)
TypeError: 'module' object is not iterable

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Program Files\Python38\lib\threading.py", line 932, in _bootstrap_inner
    self.run()
  File "C:\Program Files\Python38\lib\threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Program Files\Python38\lib\site-packages\django\utils\autoreload.py", line 53, in wrapper
    fn(*args, **kwargs)
  File "C:\Program Files\Python38\lib\site-packages\django\core\management\commands\runserver.py", line 117, in inner_run
    self.check(display_num_errors=True)
  File "C:\Program Files\Python38\lib\site-packages\django\core\management\base.py", line 392, in check
    all_issues = self._run_checks(
  File "C:\Program Files\Python38\lib\site-packages\django\core\management\base.py", line 382, in _run_checks
    return checks.run_checks(**kwargs)
  File "C:\Program Files\Python38\lib\site-packages\django\core\checks\registry.py", line 72, in run_checks
    new_errors = check(app_configs=app_configs)
  File "C:\Program Files\Python38\lib\site-packages\django\core\checks\urls.py", line 13, in check_url_config
    return check_resolver(resolver)
  File "C:\Program Files\Python38\lib\site-packages\django\core\checks\urls.py", line 23, in check_resolver
    return check_method()
  File "C:\Program Files\Python38\lib\site-packages\django\urls\resolvers.py", line 408, in check
    messages.extend(check_resolver(pattern))
  File "C:\Program Files\Python38\lib\site-packages\django\core\checks\urls.py", line 23, in check_resolver
    return check_method()
  File "C:\Program Files\Python38\lib\site-packages\django\urls\resolvers.py", line 407, in check
    for pattern in self.url_patterns:
  File "C:\Program Files\Python38\lib\site-packages\django\utils\functional.py", line 48, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "C:\Program Files\Python38\lib\site-packages\django\urls\resolvers.py", line 597, in url_patterns
    raise ImproperlyConfigured(msg.format(name=self.urlconf_name))
django.core.exceptions.ImproperlyConfigured: The included URLconf '<module 'barb.urls' from 'C:\\Users\\Administrator\\Desktop\\foof\\barb\\urls.py'>' does not appear to have any patterns in it. If you see valid patterns in the file then the issue is probably caused by a circular import.

The bad part is During handling of the above exception, another exception occurred.

After my fix, it looks like this:

Exception in thread django-main-thread:
Traceback (most recent call last):
  File "C:\Program Files\Python38\lib\site-packages\django\urls\resolvers.py", line 590, in url_patterns
    iter(patterns)
TypeError: 'module' object is not iterable

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Program Files\Python38\lib\threading.py", line 932, in _bootstrap_inner
    self.run()
  File "C:\Program Files\Python38\lib\threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Program Files\Python38\lib\site-packages\django\utils\autoreload.py", line 53, in wrapper
    fn(*args, **kwargs)
  File "C:\Program Files\Python38\lib\site-packages\django\core\management\commands\runserver.py", line 117, in inner_run
    self.check(display_num_errors=True)
  File "C:\Program Files\Python38\lib\site-packages\django\core\management\base.py", line 392, in check
    all_issues = self._run_checks(
  File "C:\Program Files\Python38\lib\site-packages\django\core\management\base.py", line 382, in _run_checks
    return checks.run_checks(**kwargs)
  File "C:\Program Files\Python38\lib\site-packages\django\core\checks\registry.py", line 72, in run_checks
    new_errors = check(app_configs=app_configs)
  File "C:\Program Files\Python38\lib\site-packages\django\core\checks\urls.py", line 13, in check_url_config
    return check_resolver(resolver)
  File "C:\Program Files\Python38\lib\site-packages\django\core\checks\urls.py", line 23, in check_resolver
    return check_method()
  File "C:\Program Files\Python38\lib\site-packages\django\urls\resolvers.py", line 408, in check
    messages.extend(check_resolver(pattern))
  File "C:\Program Files\Python38\lib\site-packages\django\core\checks\urls.py", line 23, in check_resolver
    return check_method()
  File "C:\Program Files\Python38\lib\site-packages\django\urls\resolvers.py", line 407, in check
    for pattern in self.url_patterns:
  File "C:\Program Files\Python38\lib\site-packages\django\utils\functional.py", line 48, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "C:\Program Files\Python38\lib\site-packages\django\urls\resolvers.py", line 597, in url_patterns
    raise ImproperlyConfigured(msg.format(name=self.urlconf_name)) from type_error # Ram hack, remove
django.core.exceptions.ImproperlyConfigured: The included URLconf '<module 'barb.urls' from 'C:\\Users\\Administrator\\Desktop\\foof\\barb\\urls.py'>' does not appear to have any patterns in it. If you see valid patterns in the file then the issue is probably caused by a circular import.

Now the text is corrected to The above exception was the direct cause of the following exception

Change History (4)

comment:1 by Carlton Gibson, 4 years ago

Summary: Fix context for ImproperlyConfigured errorProvide context for ImproperlyConfigured exceptions in URL resolver.
Triage Stage: UnreviewedAccepted
Type: BugCleanup/optimization

Hi Ram. Thanks for the report.

I'm inclined to accept this as a cleanup.

there are a couple more place in this module where it can be added.

OK. Can we do the whole module at once?

Notes on the PR:

  • Commit messages should be in the past tense, so "Provided... "
  • I'll have a think about how/whether we need tests for this change. (🤔)

comment:2 by Mariusz Felisiak, 4 years ago

Owner: changed from Shai Berger to Ram Rachum

comment:3 by Shai Berger, 4 years ago

Cc: Shai Berger added
Triage Stage: AcceptedReady for checkin

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

Resolution: fixed
Status: assignedclosed

In bf3e822:

Fixed #31166 -- Used "raise from" when raising ImproperlyConfigured exceptions in django.urls.resolvers.

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