我目前正在尝试使用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
对象并让它登录到控制台?
更新:当我将它们发送给某个活动时,我设法让他们进来了我的回复'但是当我关闭服务器时,它似乎只能登录到控制台。有没有办法让它作为流控制器运行,以便我可以使用前端的数据?
答案 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")