Python 如何使用Flask从web套接字提供存储的数据?

Python 如何使用Flask从web套接字提供存储的数据?,python,python-3.x,flask,websocket,python-asyncio,Python,Python 3.x,Flask,Websocket,Python Asyncio,TLDR;我正在尝试运行一个从web套接字URI获取数据的客户端,然后使用Flask提供从套接字获取的数据 我预期的工作流程如下:从web套接字读取数据(异步)->将数据写入Python dict(连续)->使用Flask上的GET请求从Python dict读取数据(连续) 我面临的问题是,我正在使用Python字典进行存储,但当我从Flask中读取该字典时,它不会显示更新的值 我已经创建了一个带有代码的插图来解决我的问题 客户: import asyncio import websocket

TLDR;我正在尝试运行一个从web套接字URI获取数据的客户端,然后使用Flask提供从套接字获取的数据

我预期的工作流程如下:从web套接字读取数据(异步)->将数据写入Python dict(连续)->使用Flask上的GET请求从Python dict读取数据(连续)

我面临的问题是,我正在使用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())
应用程序:


每当我尝试向Flask页面发出GET请求时,我都会得到一个空dict的值(不反映我从web套接字添加的更改)。我希望每次get请求都能得到dict的更新值。

问题是这里涉及到两个单独的Python进程——一个是用于接收数据的异步脚本,另一个是运行flask。由于这些是独立的进程,您在第一个进程上执行的
dict
更新对第二个进程不可见


这里需要某种形式的IPC(进程间通信)机制来实现数据的可移植性和/或持久性。一个显而易见且更容易尝试的选择是使用命名的FIFO或普通文件。根据您要处理的复杂程度,使用Redis(或类似工具)也是另一种选择。

我已经开始使用Redis实现这一点,感谢您指出这一点。“命名FIFO”的确切含义是什么?在Python中,类似文件或FIFO的实现是什么?(并非真正要求代码,只是高层解释)@Rey619请查看命名FIFO。文件的实现只是我们通过
open
操作的常规文件。FWIW您可以使用
os.mkfifo
创建一个命名的FIFO(在下面调用
mkfifo(3)
)。
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()