Обнаружение ошибки импорта при запуске сервера manage.py на Django

Я работаю над проектом на Python 3.7.4 и Django 3.1.3

В процессе сборки и развертывания я хочу отправлять уведомления, обнаружив ImportError при запуске runerver'а manage.py. Например, сообщение в slack или по электронной почте.

В файле manage.py,

from django.core.management import

... execute_from_command_line(sys.argv) Я исказил синтаксис импорта в файле views.py и попытался сделать try-except для execute_from_command_line(), но не смог поймать исключение. Ошибка появляется только на консоли runserver.

Возможно, нам следует модифицировать utility.execute() внутри этой логики execute_from_command_line(), которая является модификацией пакета, поэтому я хочу избежать этого метода.

В утилите utility.execute(),

def execute(self): """ Учитывая аргументы командной строки, выясните, какая подкоманда выполняется выполняется, создайте парсер, соответствующий этой команде, и запустите его. """ try: subcommand = self.argv[1] except IndexError: subcommand = 'help' # Вывод справки, если не было задано никаких аргументов.

# Preprocess options to extract --settings and --pythonpath.
# These options could affect the commands that are available, so they
# must be processed early.
parser = CommandParser(usage='%(prog)s subcommand [options] [args]', add_help=False, allow_abbrev=False)
parser.add_argument('--settings')
parser.add_argument('--pythonpath')
parser.add_argument('args', nargs='*')  # catch-all
try:
    options, args = parser.parse_known_args(self.argv[2:])
    handle_default_options(options)
except CommandError:
    pass  # Ignore any option errors at this point.

try:
    settings.INSTALLED_APPS
except ImproperlyConfigured as exc:
    self.settings_exception = exc
except ImportError as exc:
    self.settings_exception = exc

if settings.configured:
    # Start the auto-reloading dev server even if the code is broken.
    # The hardcoded condition is a code smell but we can't rely on a
    # flag on the command class because we haven't located it yet.
    if subcommand == 'runserver' and '--noreload' not in self.argv:
        try:
            autoreload.check_errors(django.setup)()
        except Exception:
            # The exception will be raised later in the child process
            # started by the autoreloader. Pretend it didn't happen by
            # loading an empty list of applications.
            apps.all_models = defaultdict(OrderedDict)
            apps.app_configs = OrderedDict()
            apps.apps_ready = apps.models_ready = apps.ready = True

            # Remove options not compatible with the built-in runserver
            # (e.g. options for the contrib.staticfiles' runserver).
            # Changes here require manually testing as described in
            # #27522.
            _parser = self.fetch_command('runserver').create_parser('django', 'runserver')
            _options, _args = _parser.parse_known_args(self.argv[2:])
            for _arg in _args:
                self.argv.remove(_arg)

    # In all other cases, django.setup() is required to succeed.
    else:
        django.setup()

self.autocomplete()

if subcommand == 'help':
    if '--commands' in args:
        sys.stdout.write(self.main_help_text(commands_only=True) + '\n')
    elif not options.args:
        sys.stdout.write(self.main_help_text() + '\n')
    else:
        self.fetch_command(options.args[0]).print_help(self.prog_name, options.args[0])
# Special-cases: We want 'django-admin --version' and
# 'django-admin --help' to work, for backwards compatibility.
elif subcommand == 'version' or self.argv[1:] == ['--version']:
    sys.stdout.write(django.get_version() + '\n')
elif self.argv[1:] in (['--help'], ['-h']):
    sys.stdout.write(self.main_help_text() + '\n')
else:
    self.fetch_command(subcommand).run_from_argv(self.argv)

Возможно ли это только внутри Django? Или я должен использовать другой внешний пакет?

Я буду очень признателен, если вы сможете мне помочь.

Спасибо.

Вернуться на верх