间歇性错误--ImproperlyConfigured:包含的urlconf中没有任何模式

时间:2014-06-16 22:18:39

标签: django heroku

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

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

跟踪如下所示,根据外观的提示,任何事情都会非常有用。

 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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

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

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