javascript - Python Eventlet + Javascript Websocket 返回 Blob

标签 javascript python json websocket eventlet

我正在尝试使用 Python 的 Eventlet Websocket 支持,使用 this simple example :

import eventlet
from eventlet import wsgi
from eventlet import websocket
from eventlet.support import six

# demo app
import os
import json
import time
import random


@websocket.WebSocketWSGI
def handle(ws):
    """  This is the websocket handler function.  Note that we
    can dispatch based on path in here, too."""
    if ws.path == '/echo':
        while True:
            ws.send("hello")
            #ws.send(json.dumps({"msg":"hello"}))
            time.sleep(1)

    elif ws.path == '/data':
        for i in six.moves.range(10000):
            ws.send("0 %s %s\n" % (i, random.random()))
            eventlet.sleep(0.1)


def dispatch(environ, start_response):
    """ This resolves to the web page or the websocket depending on
    the path."""
    if environ['PATH_INFO'] == '/data':
        return handle(environ, start_response)
    else:
        start_response('200 OK', [('content-type', 'text/html')])
        return [open(os.path.join(
                     os.path.dirname(__file__),
                     'websocket.html')).read()]

if __name__ == "__main__":
    # run an example app from the command line
    listener = eventlet.listen(('127.0.0.1', 7000))
    print("\nVisit http://localhost:7000/ in your websocket-capable browser.\n")
    wsgi.server(listener, dispatch)

我不会在 Javascript 中包含整个 websocket 处理程序,而只是包含 ws.onmessage方法:

ws.onmessage = function (evt)
{
   console.log(evt.data)
   var received_msg = evt.data;
   #Do stuff, i.e var obj = JSON.parse(received_msg)
   #callback(obj)
};

console.log(evt.data)表示与 websocket 的连接成功(您可以假设这一切都很好)。但是,日志记录显示 Blob {size: 31, type: ""}作为 evt.data 的内容。我认为这是某种被解释为二进制(文件)数据的响应对象(尽管我可能完全错误),但我不确定如何处理它。

我发现 Blob 数据通常是类文件对象的数据类型。我想我可以这样处理它,但我真的只想来回发送 json 数据。我尝试将 dict 转储为 JSON 并发送它,但效果相同。甚至以 Blob 格式接收字符串。

如何使用eventlet用于json数据传输?

最佳答案

截至 2017 年 5 月,Eventlet websocket API 不支持字符串 websocket 框架。欢迎提供补丁,这很容易。

您的选择:

  • 在 javascript 端读取 Blob FileReader.readAsText
  • 使用另一个 websocket 库(纯 Python 实现可以与 Eventlet 修补一起正常工作)
  • 为 Eventlet websocket 库添加字符串框架支持

关于javascript - Python Eventlet + Javascript Websocket 返回 Blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44067649/

相关文章:

javascript - Xrm.Page.data.entity.save 和 OData 错误

javascript - 访问节点的最快方式

python - 故障排除 "descriptor ' 日期'需要 'datetime.datetime' 对象,但收到 'int'“

javascript - Google map 更改单选按钮选择上 JSON 覆盖的填充颜色

javascript - 表格/嵌套(?)JSON 集合,然后在服务器端访问它

javascript - Ajax 的成功和 Laravel

javascript - 使用PHP将JSON插入MySQL表

php - 在 JavaScript 警报/确认框中发送 PHP 变量

python - 将稀疏矩阵转换为密集矩阵并获得完整的特征值

python - AppEngine 处理类似请求的优雅方式