首页 > 解决方案 > 在虚拟机中运行时 Django 无法正确流式传输

问题描述

我有一个使用 django 作为后端并作为 UI 做出反应的应用程序。在后端,它只是订阅一个远程发布者,并将数据发送到 UI。

如果我在主机(mac OS)中运行应用程序,它会完美运行。从浏览器控制台,我可以看到 UI 正在接收数据并登录到控制台。总数据大小大于 2 MB。

当我在虚拟机(CentOS 7)中运行它并通过主机的浏览器打开它时,我可以看到数据正在流式传输,但大小要小得多,大约 10 KB,并且它从未登录到浏览器控制台。

一开始以为可能是连接问题,于是测试了主机和客户端的连接速度。速度测试结果是 3Gb/s,所以看起来连接很好。

然后我也尝试给虚拟机更多的处理器和内存,但还是一样。(我给了6个处理器和12G内存)

我尝试在互联网上搜索,但找不到任何解决方案。

下面是一些代码示例:

django

def stream_data(request):
    context = zmq.Context()
    sock = context.socket(zmq.SUB)
    sock.setsockopt_string(zmq.SUBSCRIBE, '')
    ip_addr = get_public_ip()
    port = '5570'
    sock.connect('tcp://{0}:{1}'.format(ip_addr, port))

    resp = StreamingHttpResponse(stream_generator(sock), content_type="text/event-stream")
    resp['Cache-Control'] = 'no-cache'
    resp['X-Accel-Buffering'] = 'no'
    return resp

def stream_generator(sock):
    while True:
        message = sock.recv()
        yield 'data:{0}\n\n'.format(encode_base64(raw))

用户界面

source = new EventSource(addr);

source.onopen = function open() {
   console.log('Connection established.');
};

source.onmessage = (e) => {
  console.log(e.data)
}

我期望两者的行为应该相同,但在虚拟机上运行无法正常工作。

标签: pythondjango

解决方案


可能是您需要检查 django 中的“设置”文件。看看你已经将虚拟机的 ip 地址添加到“ALLOWED_HOSTS”列表中。


推荐阅读