Flask-SocketIO:将消息发送回客户端

时间:2018-02-06 16:57:32

标签: javascript python json socket.io flask-socketio

我目前正在尝试使用Twitter的Streaming API实现Twitter Stream,我正在使用Flask-SocketIO在Python中使用。现在我能够发送一个emit来触发Flask中的一个函数,该函数根据一些关键字调用Twitter API,但是我希望流中的文本回到JavaScript前端,而这个前端并不太成功。例如,我可以发送一条消息,例如"嗨"如果我在收听消息',但我已经尝试将JSON发送回无效。

我的Flask功能是:

@socketio.on('my event')
def handle_my_custom_event(json):
    print('received json: ' + str(json))
    r = api.request('statuses/filter', json)
    for item in r.get_iterator():
        if 'text' in item:
            print(item['text'])
            json_data = {'data': item['text']}
            send(json_data, json=True)

在这种情况下,JSON是{'track':'$AAPL'},因此在发生时会提取关于Apple的每条推文。 item['text']是推文文字的字符串。我已尝试使用发送,也尝试使用emit('my response',json_data)并听取了我的回复'但我不确定我是否正确地做到了这一点。

我目前的前端脚本如下所示:

$(document).ready(function() {
    var socket = io.connect('http://' + document.domain + ':' + location.port);
    socket.on('connect', function() {
        socket.emit('my event', {'track': '$'+data_prices[0]['symbol'].toString()}, function(data){
            console.log(data);
            if (data.error) 
                console.log('Something went wrong on the server');

            if (data.ok)
                console.log('Event was processed successfully');
        });
    });
});

但我没有收到任何控制台日志。

我需要做什么才能在前端脚本中接收json_data对象并让它登录到控制台?

更新:当我将它们发送给某个活动时,我设法让他们进来了我的回复'但是当我关闭服务器时,它似乎只能登录到控制台。有没有办法让它作为流控制器运行,以便我可以使用前端的数据?

1 个答案:

答案 0 :(得分:0)

我发现我的问题是没有正确设置响应的监听器所以我将Flask功能更改为:

@socketio.on('my event')
def handle_my_custom_event(json):
    print('received json: ' + str(json))
    r = api.request('statuses/filter', {'track':'pizza'})
    for item in r.get_iterator():
        if 'text' in item:
            print(item['text'])
            json_data = {'data': item['text']}
            emit('my response',json_data)
然后在前端我有:

$(document).ready(function() {
    var socket = io.connect('http://' + document.domain + ':' + location.port);
    socket.on('connect', function() {
        socket.emit('my event', {'track': '$'+data_prices[0]['symbol'].toString()}, function(data){
            console.log(data);
        });
    });
    socket.on('my response', function(data){
        console.log(data);
    });
});

问题是Flask默认是同步的,并且在创建SocketIO应用程序时让消息进入,必须明确定义异步模式:

socketio = SocketIO(app, async_mode="threading") 
相关问题