TL; DR; Я пытаюсь запустить клиент, который извлекает данные из URI веб-сокетов, а затем использую Flask для обслуживания извлеченных данных из сокетов.
Мой предполагаемый рабочий процесс выглядит так: чтение данных из веб-сокетов (asyn c) -> запись данных в Python dict (постоянно) -> чтение данных из Python dict с использованием запросов GET на Flask (постоянно)
Проблема, с которой я столкнулся, заключается в том, что я использую словарь Python для хранения, но когда я читаю этот словарь из Flask, он не показывает мне обновленные значения.
Я создал иллюстрацию с кодом для моей проблемы
Клиент:
import asyncio
import websockets
import json
SOME_URI = "ws://localhost:8080/foo"
connections = set()
connections.add(SOME_URI)
class Storage:
storage = dict() # local storage dict for simplicity
@staticmethod
def store(data): # here I store the value
a, b, c = data
Storage.storage[a] = c
@staticmethod
def show(): # Here I just show the value to be used in the GET
return Storage.storage
async def consumer_handler(uri):
async with websockets.connect(uri) as websocket:
async for message in websocket:
await consumer(message)
async def consumer(message):
line = json.loads(message)
Storage.store(line) # adds message to dict
async def main():
await asyncio.wait([consumer_handler(uri) for uri in connections])
if __name__ == "__main__":
asyncio.run(main())
Приложение:
from flask import Flask
from client import Storage
app = Flask(__name__)
app.debug = True
@app.route('/bar', methods=['GET'])
def get_instruments():
res = Storage.show() # I expected here to see updated value for the dict as it fills up from websockets
return res, 200
if __name__ == "__main__":
app.run()
Каждый раз, когда я пытаюсь сделать GET запрос к странице Flask, я получаю значение пустого dict (не отражает изменения, которые я добавляю из веб-сокета). Я ожидал получать обновленное значение dict с каждым запросом GET.