Обнаружение ошибки импорта при запуске сервера 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? Или я должен использовать другой внешний пакет?
Я буду очень признателен, если вы сможете мне помочь.
Спасибо.