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