【问题标题】:Intermittent error --ImproperlyConfigured: The included urlconf doesn't have any patterns in it间歇性错误 --ImproperlyConfigured: 包含的 urlconf 中没有任何模式
【发布时间】:2014-08-06 20:00:28
【问题描述】:

首先,我见过很多类似的问题,尽管它们似乎都是基于几个因素的不同问题。

在部署到 Heroku 时,我的 Django 项目出现了一个奇怪的错误。这个错误很奇怪,因为 urlconf 和所有包含的 urlconfs 都有有效的内容。该错误是间歇性的,相同的 URL 可以(并且通常会)导致请求成功。我没有安装 django 调试工具栏(在其他问题中提到了这个原因)并且我没有使用 reverse() 除了在视图类的方法中(不是参数等)

跟踪如下,任何关于查看位置的提示都会非常有用。

 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

目前我什至不确定如何开始调试,这是最大的问题。我现在唯一的复制方法是围攻服务器,最终当流量高了一段时间时,这些故障变得更加普遍。

【问题讨论】:

    标签: django heroku


    【解决方案1】:

    Django 将在收到第一个请求时加载您的 urlconf。 Gunicorn 将根据配置/指令生成新的工作进程。例如在工作人员处理完 max_requests 之后,或者在手动部署新代码之后。

    现在,如果您使用 gevent worker,其中一个 worker 可能会收到多个并发请求。当您的工作人员处理第一个请求并加载 URLConf 时,如果 URLConf 导入中有一些 IO 操作,它可能会决定服务另一个请求(请记住,第一次导入时,您的所有视图和任何其他递归导入将也会发生。)。

    但是,由于您的 URLConf 没有完全导入,因此下一个请求的正则表达式将不匹配并引发异常。

    您可以考虑减少导入 URLConf 所需的时间。然而,正如@Tom Dickin 指出的那样,竞争条件仍然存在。

    【讨论】:

      【解决方案2】:

      最后我发现了一个在Gunicorn's github 上提出的问题,它描述了这种竞争条件。

      像这样添加一个 gunicorn conf:

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

      使用 Procfile:

      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 管理命令更改,因此这些更改中的任何一个都可能是修复。

      我不想回去再次打破它以查看它是什么,所以如果有人尝试它们并且可以确定它是哪个,请留下答案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-22
        • 2011-09-22
        • 2014-07-03
        • 2013-07-15
        • 2011-03-01
        • 2013-07-05
        • 2018-06-27
        • 1970-01-01
        相关资源
        最近更新 更多