Django: импорт вызывает ImportError только в блоке try except - PullRequest
3 голосов
/ 13 июля 2020

У меня есть два модуля, которые импортируют что-то друг от друга:

project/urls.py:

from modules.helpers import helper

urlpatterns = [
    # patterns
]

modules/helpers.py:

def helper():
    # some magic

def main():
    from project.urls import urlpatterns
    # process urlpatterns

modules/__init__.py :

from modules.helpers import main
main()

И все работает нормально , пока я не заверну from project.urls import urlpatterns, чтобы он выглядел так:

def main():
    try:
        from project.urls import urlpatterns
    except Exception as e:
        print(str(e))

Он печатает:

невозможно импортировать имя urlpatterns из частично инициализированного модуля url (скорее всего, из-за циклического импорта) (/ Users / MaxCore / Documents / www/project/project/urls.py)

Что может быть причина?

EDIT

В минимально воспроизводимом примере все также работает нормально, вероятно, исключение связано с django как-то. Что-то изменилось в порядке импорта из-за попытки кроме блока

Если я укажу modules в settings.INSTALLED_APPS (что не требуется) и runserver, он напечатает:

django .core.exceptions.AppRegistryNotReady: Приложения не загружено еще.

1 Ответ

0 голосов
/ 13 июля 2020

Я до сих пор не понимаю глубинную причину, по которой блок try-except меняет порядок загрузки, но я нашел решение:

  1. Добавить modules в settings.INSTALLED_APPS
  2. Создать apps.py в modules/ директории с содержимым:
from django.apps import AppConfig

class ModulesConfig(AppConfig):
    name = 'modules'

    def ready(self):
        from module.helpers import main
        main()
прибавить default_app_config = 'core.apps.ModulesConfig' к modules/__init__.py
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...