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

标签 python django virtualbox

我们在 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/

相关文章:

python - CentOS上virtualenv使用pip安装遇到segmentation fault

postgresql - 在 debian wheezy 上安装 postgresql 9.2(在 virtualbox 上)

virtualbox - 如何使用 rhel 7.5 os 在虚拟框中安装 gcc make perl 包

linux - 获取 VirtualBox windows guest 以使用 Linux 主机的/etc/hosts 来解析 URL

python - 在 Python 中调用 sar 会产生奇怪的结果

Python高档图像无模糊PIL

python - 如何将 pickle 数据上传到 django FileField?

django - 删除过期的访问 token

python - 为什么 `PyObject_GenericSetAttr` 使用 lambda 时的行为与命名函数不同

python - vectorizer fit_transform 如何在 sklearn 中工作?