我们在 Windows 7 主机的 Virtualbox Ubuntu LTS 12.04 客户机中运行我们的开发环境。我们在开发过程中使用 ./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/ ) 中引入,所有旧版本都可以快速运行。
在 guest 或主机中使用不同的浏览器没有区别。所请求的资源是动态的还是静态的也没有任何区别(我们在开发期间使用静态应用程序来提供静态内容)。
什么会导致这种行为?从发行说明中我们不能立即清楚这一点。
最佳答案
哇,真不敢相信我终于解决了这个问题。我遇到了完全相同的问题,您提到它只出现在 Django 1.4.17 之后的版本中,使我走上了正确的轨道。
简短的解决方案:将您的网关 IP 添加到 guest 计算机中的/etc/hosts,例如:
10.0.2.2 10.0.2.2
详细解释:Django 1.4.18 引入了对包含下划线的 header 的剥离。这是无害的,但是 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”行添加到 guest 计算机的 /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
找到您的网关地址。
关于python - Django 1.4.18 开发服务器在 VirtualBox 下响应缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28562968/