#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 django-updates+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/057.5b4e6f8ce70652de61f21962c81c4212%40djangoproject.com.