Django медленная автоперезагрузка из-за проверки системы check_url_config

Моя загрузка и автоперезагрузка на сервере запуска python manage.py занимают много времени. (25 секунд+). Я немного покопался, и, похоже, он застрял на «Выполнение системных проверок..». Чтобы исследовать больше, я добавил таймер для каждой из функций проверки.

C:\Programs\Python35-32\python.exe manage.py runserver
Performing system checks...

self.check: check_default_cache_is_configured 0.0
self.check: check_duplicate_template_settings 0.0
self.check: check_all_models 0.028018712997436523
self.check: check_model_signals 0.0
self.check: check_setting_app_dirs_loaders 0.0
self.check: check_url_config 25.260559558868408
self.check: check_admin_app 0.0
self.check: check_user_model 0.0
self.check: check_generic_foreign_keys 0.0010006427764892578
System check identified no issues (0 silenced).
self.check: 25.289578914642334
self.check_migrations: 0.08856558799743652
June 28, 2016 - 15:43:08
Django version 1.9.6, using settings 'mar16_cookifi_com.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

Я обнаружил, что в check\urls.py, resolver.url_patterns занимает много времени.

def check_resolver(resolver):
    """
    Recursively check the resolver.
    """
    from django.core.urlresolvers import RegexURLPattern, RegexURLResolver
    warnings = []
    for pattern in resolver.url_patterns:
        if isinstance(pattern, RegexURLResolver):
  1. Я не уверен, что urlresolver.url_patterns занимает много времени. Я был бы признателен за помощь в понимании того, почему загрузка url_patters занимает 25 секунд. Что я могу сделать, чтобы уменьшить это.

  2. По крайней мере, я хотел бы отключить check_url_config. Решение для 1 является более предпочтительным.

Добавлен:

Я вручную отключил функцию проверки в коде django. [Изменить] На самом деле это просто отложило проблему до первой загрузки, которая заняла 25 секунд.

@register(Tags.urls)
def check_url_config(app_configs, **kwargs):
    return []
    if getattr(settings, 'ROOT_URLCONF', None):
        from django.core.urlresolvers import get_resolver
        resolver = get_resolver()
        return check_resolver(resolver)
    return []

Время сокращается до доли секунды:

C:\Programs\Python35-32\python.exe manage.py runserver
Performing system checks...

self.check: check_default_cache_is_configured 0.0
self.check: check_duplicate_template_settings 0.0
self.check: check_all_models 0.028048038482666016
self.check: check_model_signals 0.0
self.check: check_setting_app_dirs_loaders 0.0
self.check: check_url_config 0.0
self.check: check_admin_app 0.0
self.check: check_user_model 0.0
self.check: check_generic_foreign_keys 0.0
System check identified no issues (0 silenced).
self.check: 0.028048038482666016
self.check_migrations: 0.06304526329040527
June 28, 2016 - 16:24:36
Django version 1.9.6, using settings 'mar16_cookifi_com.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

Но я хотел бы иметь решение, в котором я не изменяю код django.

Еще через 1 час:

Нашел причину проблемы. Файл URL загружает все наши представления. В одно из представлений недавно был добавлен модуль машинного обучения, обучение которого занимает 25 секунд. Ленивый модуль машинного обучения сократил время загрузки до секунды.


person mithuntnt    schedule 28.06.2016    source источник


Ответы (1)


В Django есть SILENCED_SYSTEM_CHECKS, который предотвращает отображение предупреждений. отображается, но у него нет ловушки для предотвращения запуска проверки.

Вы можете предотвратить проверку URL, закомментировав импорт в исходном коде Django.

Однако я не уверен, что это ускорит ваше приложение. Когда шаблоны URL загружаются, Django одновременно импортирует представления. Если вы отключите проверку URL-адресов, Django все равно потребуется загрузить конфигурацию URL-адреса позже, поэтому я подозреваю, что вы увидите аналогичную задержку. Вам следует продолжить расследование, чтобы выяснить, какие включенные urls.py файлы и представления загружаются долго.

person Alasdair    schedule 28.06.2016
comment
Я попытался отключить проверку, изменив код. теперь manage.py загружается за миллисекунды. Но я бы предпочел способ, который не касается кода django. - person mithuntnt; 28.06.2016
comment
Как я уже сказал, в Django нет хука для предотвращения запуска проверки. Я бы углубился в то, почему проверка выполняется так долго, а не отключал ее. Я предполагаю, что есть проблема в конфигурации или представлениях ваших URL-адресов. - person Alasdair; 28.06.2016
comment
Нашел причину проблемы. Файл URL загружает все наши представления. В одно из представлений недавно был добавлен модуль машинного обучения, обучение которого занимает 25 секунд. Ленивый модуль машинного обучения сократил время загрузки до секунды. Большое спасибо за помощь. - person mithuntnt; 28.06.2016