#33107: ImportError: partially initialized module '...' has no attribute '...'
(most likely due to a circular import)
-------------------------------------------+------------------------
Reporter: Collin Anderson | Owner: nobody
Type: Bug | Status: new
Component: Uncategorized | Version: dev
Severity: Normal | Keywords:
Triage Stage: Unreviewed | Has patch: 0
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
-------------------------------------------+------------------------
Today I've been getting some occasional "ImportError"s when reloading the
runserver. I have a feeling it's a race condition when importing my custom
auth backend when runserver is reloading, likely caused by #33099 cached
imports, committed on Friday. It doesn't happen every time which makes it
harder to track down.
Maybe the `cached_import` logic needs to somehow check for a "partially
initialized module" and use the slow-path in that case?
I'm not 100% it's not just an issue on my end, but I at least wanted to
raise this here in case other people have issues and want to diagnose
further.
Here's an example (ImportError when importing my custom auth backend):
{{{
Request Method: GET
Request URL: /cart/dropdown/
Django Version: 4.0.dev20210913065016
Python Version: 3.8.10
Template error:
In template templates/order/cart_dropdown.html, error at line 3
Module "authbackend" does not define a "Bknd" attribute/class
3 : {% if request.order.ops %}
Traceback (most recent call last):
File "django/template/base.py", line 862, in _resolve_lookup
current = current[bit]
During handling of the above exception ('WSGIRequest' object is not
subscriptable), another exception occurred:
File "django/utils/module_loading.py", line 26, in import_string
return cached_import(module_path, class_name)
File "django/utils/module_loading.py", line 12, in cached_import
return getattr(modules[module_path], class_name)
The above exception (partially initialized module 'authbackend' has no
attribute 'Bknd' (most likely due to a circular import)) was the direct
cause of the following exception:
File "django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "django/core/handlers/base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args,
**callback_kwargs)
File "django/shortcuts.py", line 19, in render
content = loader.render_to_string(template_name, context, request,
using=using)
File "django/template/loader.py", line 62, in render_to_string
return template.render(context, request)
File "django/template/backends/django.py", line 61, in render
return self.template.render(context)
File "django/template/base.py", line 176, in render
return self._render(context)
File "django/template/base.py", line 168, in _render
return self.nodelist.render(context)
File "django/template/base.py", line 977, in render
return SafeString(''.join([
File "django/template/base.py", line 978, in <listcomp>
node.render_annotated(context) for node in self
File "django/template/base.py", line 938, in render_annotated
return self.render(context)
File "django/template/defaulttags.py", line 386, in render
return
strip_spaces_between_tags(self.nodelist.render(context).strip())
File "django/template/base.py", line 977, in render
return SafeString(''.join([
File "django/template/base.py", line 978, in <listcomp>
node.render_annotated(context) for node in self
File "django/template/base.py", line 938, in render_annotated
return self.render(context)
File "django/template/defaulttags.py", line 288, in render
match = condition.eval(context)
File "django/template/defaulttags.py", line 829, in eval
return self.value.resolve(context, ignore_failures=True)
File "django/template/base.py", line 701, in resolve
obj = self.var.resolve(context)
File "django/template/base.py", line 829, in resolve
value = self._resolve_lookup(context)
File "django/template/base.py", line 870, in _resolve_lookup
current = getattr(current, bit)
File "order/middleware.py", line 20, in __get__
if not request.user.pk: # if not logged in
File "django/utils/functional.py", line 248, in inner
self._setup()
File "django/utils/functional.py", line 384, in _setup
self._wrapped = self._setupfunc()
File "django/contrib/auth/middleware.py", line 25, in <lambda>
request.user = SimpleLazyObject(lambda: get_user(request))
File "django/contrib/auth/middleware.py", line 11, in get_user
request._cached_user = auth.get_user(request)
File "django/contrib/auth/__init__.py", line 183, in get_user
backend = load_backend(backend_path)
File "django/contrib/auth/__init__.py", line 21, in load_backend
return import_string(path)()
File "django/utils/module_loading.py", line 28, in import_string
raise ImportError('Module "%s" does not define a "%s" attribute/class'
% (
Exception Type: ImportError at /cart/dropdown/
Exception Value: Module "authbackend" does not define a "Bknd"
attribute/class
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/33107>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/057.5b4e6f8ce70652de61f21962c81c4212%40djangoproject.com.