Периодическая ошибка --ImproperlyConfigured: включенная urlconf не содержит шаблонов.

Прежде всего, я видел много подобных вопросов по этому поводу, хотя все они кажутся разными проблемами, основанными на нескольких факторах.

Я получаю странную ошибку в своем проекте Django при развертывании в Heroku. Ошибка странная, потому что urlconf и все включенные urlconf имеют допустимый контент. Ошибка прерывистая, один и тот же URL-адрес может (и обычно приводит) к успешному запросу. У меня не установлена ​​панель инструментов отладки django (упомянутая как причина этого в других вопросах), и у меня нет reverse(), используемого кроме как внутри методов в классах представления (не params и т. д.)

След ниже, что-нибудь вообще с точки зрения намеков на то, где искать, было бы невероятно полезно.

 Traceback (most recent call last):

      File "/app/.heroku/python/lib/python2.7/site-packages/django/core/handlers/base.py", line 90, in get_response
        response = middleware_method(request)

      File "/app/.heroku/python/lib/python2.7/site-packages/newrelic-2.16.0.12/newrelic/hooks/framework_django.py", line 215, in wrapper
        return wrapped(*args, **kwargs)

      File "/app/.heroku/python/lib/python2.7/site-packages/django/middleware/common.py", line 71, in process_request
        if (not urlresolvers.is_valid_path(request.path_info, urlconf) and

      File "/app/.heroku/python/lib/python2.7/site-packages/django/core/urlresolvers.py", line 573, in is_valid_path
        resolve(path, urlconf)

      File "/app/.heroku/python/lib/python2.7/site-packages/django/core/urlresolvers.py", line 453, in resolve
        return get_resolver(urlconf).resolve(path)

      File "/app/.heroku/python/lib/python2.7/site-packages/newrelic-2.16.0.12/newrelic/hooks/framework_django.py", line 518, in wrapper
        return wrapped(*args, **kwargs)

      File "/app/.heroku/python/lib/python2.7/site-packages/django/core/urlresolvers.py", line 318, in resolve
        for pattern in self.url_patterns:

      File "/app/.heroku/python/lib/python2.7/site-packages/django/core/urlresolvers.py", line 350, in url_patterns
        raise ImproperlyConfigured("The included urlconf %s doesn't have any patterns in it" % self.urlconf_name)

    ImproperlyConfigured: The included urlconf core.urls doesn't have any patterns in it

На данный момент я даже не уверен, как начать отлаживать это, что является самой большой проблемой. Единственный способ дублирования, который у меня есть сейчас, - это осада сервера, в конечном итоге, когда трафик какое-то время был высоким, эти сбои становятся более распространенными.


person Tom Manterfield    schedule 16.06.2014    source источник


Ответы (2)


В конце концов я нашел проблему, поднятую на Gunicorn's github, в которой описывается это состояние гонки.

Добавление конфигурации gunicorn следующим образом:

def post_fork(server, worker):
    from django.core.urlresolvers import resolve
    resolve('/')

С профайлом:

web: gunicorn core.wsgi:application -b "0.0.0.0:$PORT" -w 5 -k gevent --max-requests 250 --preload --settings=core.settings -c /app/core/gunicorn_conf.py

Кажется, полностью убрал эту ошибку.

При этом procfile изменился из команды управления django run_gunicorn одновременно, поэтому любое из этих изменений могло быть исправлением.

У меня нет желания возвращаться и ломать его снова, чтобы увидеть, что это было, поэтому, если кто-то попробует их оба и может точно сказать, что это было, пожалуйста, оставьте ответ.

person Tom Manterfield    schedule 24.06.2014

Django загрузит ваш urlconf, когда получит первый запрос. Gunicorn создаст новые рабочие процессы в соответствии с конфигурацией/инструкцией. Например, после обработки max_requests рабочим процессом или после ручного развертывания нового кода.

Теперь, если вы используете gevent worker, один из этих worker может получать несколько одновременных запросов. Пока ваш worker работает над первым запросом и загружает URLConf, он может решить обслужить другой запрос, если в импорте URLConf есть какая-то операция ввода-вывода (помните, что при первом импорте все ваши представления и любой другой рекурсивный импорт будут тоже бывает.).

Однако, поскольку ваш URLConf не импортирован полностью, регулярное выражение для следующего запроса не будет совпадать, и будет возбуждено исключение.

Вы можете сократить время, необходимое для импорта файла URLConf. Однако состояние гонки все еще существует, как указал @Tom Dickin.

person Subramanian    schedule 29.10.2014