Python 无法将websocket数据流式传输到前端
我正试图通过股票经纪人(Zerodha)的websockets sdk将市场实时数据流到我的前端 我可以在python控制台中记录实时数据,但无法将其流式传输到前端 我是新的套接字编程,所以请原谅 下面是python代码片段Python 无法将websocket数据流式传输到前端,python,callback,flask-socketio,Python,Callback,Flask Socketio,我正试图通过股票经纪人(Zerodha)的websockets sdk将市场实时数据流到我的前端 我可以在python控制台中记录实时数据,但无法将其流式传输到前端 我是新的套接字编程,所以请原谅 下面是python代码片段 import json from flask import Flask, render_template, request, redirect, session import threading import time from kiteconnect import
import json
from flask import Flask, render_template, request, redirect, session
import threading
import time
from kiteconnect import KiteTicker #WebSocket client for connecting to Kite Connect's streaming quotes service.
import logging
###
from flask_socketio import SocketIO, emit
###
app = Flask(__name__)
##
socketio = SocketIO(app, async_mode= 'threading')
##
app.config['DEBUG'] = False
ticker = None
@app.route('/streamData')
def streamData():
'''
to start stream we first have to
1.) initiliase a WS connection - done
2.) Subscribe/register the symbols - done
3.) Check on new ticks - done
4.) To do: kill the ws after x time
'''
global ticker
accessToken = getAccessToken()
ticker = KiteTicker("api key here", accessToken)#1
# Assign the callbacks.
ticker.on_connect = onConnectLocal
ticker.on_close = onDisconnectLocal
ticker.on_error = onErrorLocal
ticker.on_ticks = onNewTicksLocal#3
logging.info('Ticker: Going to connect..')
ticker.connect(threaded=True)
time.sleep(5)
symbols = ['stock', 'names', 'given', 'here']
tokens = []
kite = getKite()
fetchInstruments(kite)
for symbol in symbols:
isd = getInstrumentDataBySymbol(symbol)
token = isd['instrument_token']
logging.info('registerSymbol: %s token = %s', symbol, token)
tokens.append(token)
logging.info('Subscribing tokens %s', tokens)
ticker.subscribe(tokens)#2
print(tokens)
return render_template('stream.html', async_mode='threading') # here is where I want to stream the data
def onConnectLocal(ws, response):
logging.info('Ticker connection successful.')
def onDisconnectLocal(ws, code, reason):
logging.error('Ticker got disconnected. code = %d, reason = %s', code, reason)
def onErrorLocal(ws, code, reason):
logging.error('Ticker errored out. code = %d, reason = %s', code, reason)
#@socketio.on('my_broadcast_event', namespace='/test')
def onNewTicksLocal(ws, ticks):#3 # this the method which streams data from the broker's websocket
for tick in ticks:
isd = getInstrumentDataByToken(tick['instrument_token'])
symbol = isd['tradingsymbol']
logging.info('Tick: %s CMP = %f', symbol, tick['last_price']) #this prints to the python console with no problem
socketio.emit('my_response',{'data': tick}, broadcast=True)# this makes the problem
app.run('localhost', 8080)
stream.html(前端)
但是正如你在上面看到的,我已经提供了这个(当我点击广播按钮时,我得到了这个错误)
请让我知道我哪里出了问题(我觉得,但不确定,我可能回拨出了问题)
编辑:-用python更新html代码和端口号您似乎将股票经纪人的API与Socket.IO混合在一起。
onNewTicksLocal()
是针对股票经纪人的回调,它不需要是Socket.IO事件处理程序。我注释掉了@socketio.on('my_broadcast_event',namespace='/test'),它不会给出任何错误,但不会将任何数据流/显示到前端…您正在使用一个名为/test
的命名空间。如果希望客户端接收事件,则必须在同一命名空间上发出。另外,您的客户端似乎没有my\u响应
事件处理程序。@Miguel,很抱歉,我最初没有给出正确的html代码。我已经更新了这个问题。但是我仍然无法在控制台中获取任何数据。logOk,我让它工作了。在客户端,我只需要使用namespace='&数据流。
<script src="//code.jquery.com/jquery-1.12.4.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js"></script>
<script type="text/javascript" charset="utf-8">
$(document).ready(function() {
namespace = 'http://localhost:8080/streamData';
var socket = io(namespace);
socket.on('connect', function() {
socket.emit('my_event', {data: 'connected to the SocketServer...'});
});
socket.on('my_response', function(msg, cb) {
$('#log').append('<br>' + $('<div/>').text('logs #' + msg.count + ': ' + msg.data).html());
if (cb)
cb();
});
$('form#emit').submit(function(event) {
socket.emit('my_event', {data: $('#emit_data').val()});
return false;
});
$('form#broadcast').submit(function(event) {
socket.emit('my_broadcast_event', {data: $('#broadcast_data').val()});
return false;
});
$('form#disconnect').submit(function(event) {
socket.emit('disconnect_request');
return false;
});
socket.on('my_response', function(data){
console.log(data.msg)
socket.emit('my_response', {data: data.msg});
});
});
</script>
TypeError: onNewTicksLocal() missing 1 required positional argument: 'ticks'