作为服务器和客户端的 Python Flask SocketIO 应用程序

时间:2021-07-28 20:50:28

标签: python flask websocket socket.io python-multithreading

我想要实现的目标: 获取某些加密货币的当前价格并将其打印在一个简单的 HTML/JavaScript 前端。该应用将无限期地继续这样做。

我一直在尝试的内容:我一直在尝试构建一个 Python Flask 服务器来从 Binance websocket 获取货币,并使用 websocket 将它们发送到前端。

到目前为止我得到了什么:前端将第一条消息发送到后端,但没有收到响应。此外,我可以获得货币的价格,但服务器不会将它们发送到前端。

我需要什么:一些新的观点来指导我找到解决方案(当然:-))

一些想法

  1. 我是否正确使用线程?
  2. 我应该使用一些内存结构放在中间吗?
  3. 纯 Flask 是否支持此业务需求?
  4. 我应该一起使用 Tornado 之类的东西吗?

前端

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Synchronized Slider</title>
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css">
        <script src="https://code.jquery.com/jquery-3.3.1.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js" integrity="sha512-q/dWJ3kcmjBLU4Qc47E4A9kTB4m3wuTY7vkFJDTZKjTs8jhyGQnaUrxa0Ytd0ssMZhbNua9hE+E7Qv1j+DyZwA==" crossorigin="anonymous"></script>
        
    </head>
    <body>
        <div class="container text-center">
            <h1 >Tradings...</h1>
        </div>
        <script>
            $(document).ready(function(){
                var socket = io('ws://localhost:5000');
                
                socket.on('connect', function() {
                    socket.emit(
                        'front_msg', {data: 'Trying to connect...'});
                });

                socket.on('back_msg', function(msg) {
                    console.log(JSON.stringify(msg))
                });

                socket.on('binance_msg', function(msg) {
                    console.log(JSON.stringify(msg))
                });
            });
        </script>
    </body>
</html>

Flask 服务器

from flask import Flask, render_template
from flask_socketio import SocketIO, emit

import threading
import websocket
import json

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app, cors_allowed_origins="*")

@app.route('/')
def index():
    return render_template('index.html')

@socketio.on('connect')
def test_connect():
    emit('back_msg', {'data': 'Connected.'})

@socketio.on('disconnect')
def test_disconnect():
    print('Disconnect.')

@socketio.on('front_msg')
def handle_front_msg(json):
    print('handle_front_change: ' + str(json))
    json['data'] = 'changed'
    emit('back_msg', json)

def on_message(ws, message):
    json_message = json.loads(message)
    crypto = json_message['s']
    value = json_message['p']
    print(f'{crypto}:{value}')
    emit('binance_msg', {'crypto':crypto, 'value':value})

def binance_websocket():
    socket = 'wss://stream.binance.com:9443/ws'
    currencies = ['btc', 'eth', 'axs']
    for currency in currencies:
        socket += f"/{currency}usdt@trade"

    ws = websocket.WebSocketApp(socket, on_message=on_message)
    ws.run_forever()

if __name__ == '__main__':
    binance_thread = threading.Thread(target=binance_websocket)
    binance_thread.start()
    socketio.run(app, debug=True)

0 个答案:

没有答案
相关问题