Django 1.4.18 开发服务器在 VirtualBox 下响应缓慢

Django 1.4.18 dev server slow to respond under VirtualBox

我们 运行 我们的开发环境在 virtualbox Ubuntu LTS 12.04 客户机中,在 Windows 7 主机中。我们在开发过程中使用 ./manage.py runserver。

最近我们将 Django 版本升级到最新版本 (1.4.19),但注意到一个非常奇怪的行为:来自主机的请求需要 5-30 秒才能处理,而来自 VM 内部的请求不到第二,因为他们应该是。该问题已在 Django 1.4.18 (https://docs.djangoproject.com/fr/1.7/releases/1.4.18/) 中引入,所有旧版本都可以快速运行。

在来宾或主机中使用不同的浏览器没有区别。所请求的资源是动态的还是静态的也没有任何区别(我们在开发过程中使用静态应用程序来提供静态内容)。

什么会导致这种行为?从发行说明中我们不能立即清楚。

哇,真不敢相信我终于解决了这个问题。我遇到了 完全 相同的问题,您提到它只出现在 Django 1.4.17 之后的版本中,使我走上了正确的轨道。

简短的解决方案: 将您的网关 IP 添加到来宾计算机中的 /etc/hosts,例如:

10.0.2.2 10.0.2.2

详细解释: Django 1.4.18 引入了对包含下划线的 headers 的剥离。那是无害的,但是 django.core.servers.basehttp.WSGIRequestHandler.get_environ 方法略有改变。从 1.4.18 开始,它依赖于 wsgiref.simple_server.WSGIRequestHandler.get_environ,其中包含以下行:

host = self.address_string()

address_stringBaseHTTPServer:

的方法
 def address_string(self):
    """Return the client address formatted for logging.

    This version looks up the full hostname using gethostbyaddr(),
    and tries to find a name that contains at least one dot.

    """

    host, port = self.client_address[:2]
    return socket.getfqdn(host)

对 getfqdn 的调用是(缓慢的)罪魁祸首:

In [1]: import socket
In [2]: %time socket.getfqdn("10.0.2.2")
CPU times: user 0 ns, sys: 0 ns, total: 0 ns
Wall time: 1.56 s
Out[2]: '10.0.2.2'

在我的来宾计算机中将“10.0.2.2 10.0.2.2”行添加到 /etc/hosts 后,主机名解析几乎是即时的:

In [3]: %time socket.getfqdn("10.0.2.2")
CPU times: user 0 ns, sys: 0 ns, total: 0 ns
Wall time: 834 µs
Out[3]: '10.0.2.2'

请注意,您的网关地址可以在您的访客环境中通过 运行 route -n 找到。