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_string
是 BaseHTTPServer
:
的方法
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
找到。
我们 运行 我们的开发环境在 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_string
是 BaseHTTPServer
:
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
找到。