ImportError: cannot import name 'get_rule_detail' from 'jira_plug.utils.rule' (D:\code\ido-jira-plug\IdoJiraPlug\jira_plug\utils\rule.py)
Мой проект Django имеет проблему при запуске
Это мой проект,
IdoJiraPlug
- jira_plug
- __init__.py
- api
__init__.py
config.py
- serializers
__init__.py
request_serializer.py
- utils
__init__.py
rule.py
- urls.py
- manage.py
jira_plug.utils.__init__.py
from .rule import *
jira_plug.utils.rule.py
...
from jira_plug.serializers import RuleConfigInfoSerializer
...
jira_plug.serializers.__init__.py
from .request_serializer import *
jira_plug.serializers.request_serializer.py
...
from jira_plug.utils import JiraAction, get_msg_data, get_rule_detail, handle_message_content
...
Мне кажется, что это происходит потому, что rule.py и request_serializer.py импортируют друг друга, но я не знаю истинной причины. Я пытаюсь использовать 'from jira_plug.utils.rule import get_rule_detail, handle_message_content', но все равно возникает эта ошибка.
В вашем jira_plug
приложении в utils.py
файле нет get_rule_detail
класса или функции или имени переменной.
Если вы уверены, что он существует - попробуйте проверить каждую букву в имени в utils.py, возможно, вы найдете ошибку.
Я решил эту проблему.Настоящая причина - циркулярный импорт.Когда django стартует, urls.py будет использоваться import_module().python начнет загружать модуль шаг за шагом согласно jira_plug.urls.py.
- jira_plug.urls.py, 5 строка:
from . import api
, тогда python загрузит jira_plug.api.__init__.py модуль. - jira_plug.api.__init__.py, 3 строка:
from .config import *
, затем python загрузит jira_plug.api.config.py module. - jira_plug.api.config.py, 5 строка:
from jira_plug.utils import JiraAction
, затем python загрузит jira_plug.utils.__init__.py module. - jira_plug.utils.__init__.py, 6 строка:
from .rule import *
, затем python загрузит jira_plug.utils.rule.py module. - jira_plug.utils.rule.py, 4 строка:
from jira_plug.serializers import RuleConfigInfoSerializer
, тогда python загрузит jira_plug.serializers.__init__.py module. - jira_plug.serializers.__init__.py, 4 строка:
from .request_serializer import *
, затем python загрузит jira_plug.serializers.request_serializer.py module. - jira_plug.serializers.request_serializer.py, 6 строка:
from jira_plug.utils import JiraAction, get_msg_data, get_rule_detail, handle_message_content
, тогда python будет загружать jira_plug.utils пакет.
Лучшим решением будет абстрагирование общего пакета.
Временным решением является изменение jira_plug.api.config.py.
# from jira_plug.utils import JiraAction
from jira_plug.utils.call_jira import JiraAction
Это приведет к тому, что после шага 3 все исчезнет. Но это скрытая опасность, мне уже придется абстрагировать общие методы. Это решение - просто пример!