首先,我已经看到很多类似的问题,尽管它们似乎都是基于几个因素的不同问题。
部署到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
目前我甚至不确定如何开始调试,这是最大的问题。我现在唯一复制的方法是对服务器进行围攻,最终当流量高达一段时间后,这些故障变得更加普遍。
答案 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指出。