Flask-SocketIO: отправка сообщений обратно клиенту

В настоящее время я пытаюсь реализовать поток Twitter с использованием API потоковой передачи Twitter, и я использую Flask-SocketIO для использования в Python. Теперь я могу отправить сообщение, чтобы вызвать функцию во Flask, которая вызывает API Twitter на основе некоторого ключевого слова, но я хочу, чтобы текст из потока возвращался во внешний интерфейс 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'] — строка текста твита. Я пробовал использовать send, также пытался использовать 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 в моем внешнем скрипте и вывести его на консоль?

ОБНОВЛЕНИЕ: мне удалось получить их, когда я отправляю их в событие «мой ответ», но, похоже, они регистрируются в консоли только тогда, когда я закрываю сервер. Есть ли способ сохранить это как поток на консоль, чтобы я мог использовать данные во внешнем интерфейсе?


person Alexander Hepburn    schedule 06.02.2018    source источник


Ответы (1)


Я обнаружил, что моя проблема заключалась в том, что прослушиватель ответа был неправильно настроен, поэтому я изменил функцию 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") 
person Alexander Hepburn    schedule 06.02.2018