#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.

Reply via email to