python - 在虚拟机中运行时 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)
}
我期望两者的行为应该相同,但在虚拟机上运行无法正常工作。
解决方案
可能是您需要检查 django 中的“设置”文件。看看你已经将虚拟机的 ip 地址添加到“ALLOWED_HOSTS”列表中。
推荐阅读
- vb.net - vb6 - 使用结构作为类属性类型
- react-native - 在重新启动应用程序不起作用时设置权限
- google-cloud-platform - 如何设置从本地到 Google Cloud VPC 的 VPN
- javascript - JS ClipboardEvent 剪贴板数据始终为空
- angular - Angular 4 - ngFor 下拉/选择选项在 IE11 上非常慢,如何优化 ngDoCheck 执行?
- google-analytics - 在谷歌电子表格中跟踪转化率
- dynamics-crm - crm dynamics 2016 限制笔记中的文件数量
- javascript - React Router Dom(四)编程导航
- angular - 从 URL 的参数初始化步进器
- amazon-web-services - sam local 也可以创建 SNS 主题吗?