如何使我的Rest Api服务器与Web Socket服务器进行通信

10

这是我的问题,部分解决了但我认为解决方式不够好。我有一个REST API服务器,有一个只执行批处理的POST方法。该方法立即返回200(没有任何内容),并且批处理过程在服务器上继续执行其任务。此批处理过程有一个日志文件,我通常使用 tail -f mylogfile.log 在线查看。现在我想使用websocket服务器将尾部进程的输出发送到网页。websocket服务器的代码如下:

import os
import asyncio
import websockets
import subprocess

from frontserv.start_server import WEBSOCKET_INTERCHANGE_FILE


async def main(websocket, path):
    print("-> STARTING")
    exists = os.path.isfile(WEBSOCKET_INTERCHANGE_FILE)
    if not exists:
        f = open(WEBSOCKET_INTERCHANGE_FILE, "w+")
        f.close()

    exe = ["tail", "-f", WEBSOCKET_INTERCHANGE_FILE]
    message = ""
    p = subprocess.Popen(exe, stdout=subprocess.PIPE, stderr=None)
    while True:
        retcode = p.poll()
        print(message)
        message = message + p.stdout.readline().decode("utf-8") + "<br>"
        await websocket.send(message)
        await asyncio.sleep(0.1)


start_server = websockets.serve(main, '127.0.0.1', 5678)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

我可以访问批处理代码,我认为有一种更好的方法来解决这个问题。如果我能够将消息发送到websocket服务器,然后将消息分派到浏览器,而不是记录到文件中,我认为这将是一种更好的实现方式。

最好的问候!


我会使用发布/订阅方法,因此日志记录过程将向命名通道发布数据,WebSocket服务器侦听该命名通道以推送任何更新(例如,使用Redis或使用WebSocket客户端到同一WebSocket服务器)... 我可以在C和Ruby中完成这个任务,但我不是Python专家。 - Myst
你可以通过生成一个日志处理程序类,从应用程序本身流式传输日志记录。我做了类似的事情 - 0e1val
1个回答

3
如果您只想通过Websockets将进程的输出发送给客户端,我建议您查看websocketd。您只需告诉它要监听的端口和要运行的命令即可。
$ websocketd --port=8080 my-program

当客户端连接并提供输出时,它将运行命令并为其提供服务。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接