Исходный код django.utils.module_loading
import copy
import os
from importlib import import_module
from importlib.util import find_spec as importlib_find
[документы] Защита import_string ( dotted_path ):
«» «
Импорт пунктирного путь модуля и возвращает атрибут / класс , обозначенный на
.. фамилиях в пути Raise ImportError если импорт не удался
» «»
попробуйте :
module_path , class_name = dotted_path . rsplit ( '.' , 1 ),
кроме ValueError как err :
raise ImportError ( " % s не похож на путь к модулю"
модуль = import_module ( путь_модуля )
попробуйте :
обратный GetAttr ( модуль , class_name ) , за
исключением AttributeError , как заблуждается :
повышение ImportError ( 'Модуль " % s " не определяет " % s " атрибут / класс' % (
module_path , class_name )
) от ERR
def autodiscover_modules ( * args , ** kwargs ):
"" "
Автоматическое обнаружение модулей INSTALLED_APPS и тихий сбой, если они
отсутствуют. Это заставляет импорт на них регистрировать любые административные биты, которые они
могут пожелать.
Вы можете предоставить параметр ключевого слова register_to как способ доступа к
реестру. Этот объект register_to должен иметь переменную экземпляра _registry
для доступа к нему.
«» "
От django.apps импорта приложений
register_to = kwargs . get ( 'register_to' )
для app_config в приложениях . get_app_configs ():
для module_to_search в args :
# Попытка импортировать модуль приложения.
попробуйте :
if register_to :
before_import_registry = copy . копия ( register_to . _registry )
import_module ( ' % s . % s ' % ( app_config . name , module_to_search ))
except Exception :
# Сбросить реестр в состояние до последнего импорта
# так как этот импорт должен будет повториться при следующем запросе и
# это может вызвать NotRegistered и
# исключений уже
зарегистрировано (см. # 8245). если register_to :
register_to . _registry = before_import_registry
# Решите, следует ли выдувать эту ошибку. Если в приложении просто
# нет рассматриваемого модуля, мы можем игнорировать ошибку
# при попытке его импорта, иначе мы хотим, чтобы она всплыла.
если module_has_submodule ( app_config . module , module_to_search ):
поднять
def module_has_submodule ( package , module_name ):
"" "
Проверить , находится ли 'модуль' в 'пакете'." "" try :
package_name = package . __name__
package_path = package . __path__
except AttributeError :
# пакет не является пакетом.
return False
full_module_name = package_name + '' + Module_name
попытка :
возвращение importlib_find ( full_module_name , package_path ) не является не Никто ,
кроме ( ModuleNotFoundError , AttributeError ):
# Когда module_name является недопустимым пунктирным путем, Python поднимает
# ModuleNotFoundError. AttributeError возникает в PY36 (исправлено в PY37)
#, если предпоследняя часть пути не является пакетом.
return False
def module_dir ( module ):
"" "
Найдите имя каталога, в котором находится модуль, если возможно.
В противном случае поднимите ValueError, например, для пакетов пространства имен, которые разделены
на несколько каталогов.
"" "
# Преобразовать в список, потому что _NamespacePath не поддерживает индексацию.
Paths = list ( getattr ( module , '__path__' , []))
if len ( paths ) == 1 :
return paths [ 0 ]
else :
filename = getattr ( модуль , '__file__' , Нет ),
если имя файла пока не None :
возвращение ОС . путь . dirname ( filename )
raise ValueError ( "Невозможно определить каталог, содержащий % s " % модуль )