Python Eventlet + Javascript Websocket returns Blob
Python Eventlet + Javascript Websocket returns Blob
我正在试验 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-05 Eventlet websocket API 不支持字符串 websocket 框架。欢迎打补丁,很简单
您的选择:
- 在 javascript 结束时读取 Blob FileReader.readAsText
- 使用另一个 websocket 库(纯 Python 实现可以很好地使用 Eventlet 补丁)
- 向 Eventlet websocket 库添加字符串框架支持
我正在试验 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-05 Eventlet websocket API 不支持字符串 websocket 框架。欢迎打补丁,很简单
您的选择:
- 在 javascript 结束时读取 Blob FileReader.readAsText
- 使用另一个 websocket 库(纯 Python 实现可以很好地使用 Eventlet 补丁)
- 向 Eventlet websocket 库添加字符串框架支持