实现目的:
因为项目从flask迁移到fastapi上,导致flask-sse无法使用
期间尝试了很多websocket相关库如:
starlette.websockets
sse_starlette.sse import EventSourceResponse等
期间踩了无数坑
后来发现了websocket-client库
第一步 搭建简单的fastapi 服务
from fastapi import FastAPI, Request
from client_web import WSClient
from typing import Optional
from pydantic import BaseModel, Field
app = FastAPI()
class EventAdd(BaseModel):
datas: Optional[str] = None
# 用来接收事件的接口
@app.post('/send')
def send(item:EventAdd):
#websockt服务端接口
address = "ws://127.0.0.1:1234/ws"
# 初始化
web_client = WSClient(address)
web_client.send(item.datas)
# 测试fastapi
@app.get('/')
def test():
return 'test'
第二步 搭建 websock客户端,用来创建websocket对象,实现长连接方式
client-server.py
import json
import time
from websocket import create_connection
class WSClient:
def __init__(self, address):
self.ws = create_connection(address)
def send(self, params):
print("Sending ...")
self.ws.send(json.dumps(params))
print("Sending Data: {}".format(params))
print("Reeiving...")
result = self.ws.recv()
print("Received '{}'".format(result))
def quit(self):
self.ws.close()
第三步 搭建websocket服务端 用来测试是否能接受事件接口通过客户端发送的数据,测试成功就说明发送没问题,就可以让前端实现服务端进行接收了
service_web.py
#!/usr/bin/env python
# encoding: utf-8
import websockets
import asyncio
class WSserver():
async def handle(self, websocket, path):
recv_msg = await websocket.recv()
print("i received %s" % recv_msg)
await websocket.send('server send ok')
def run(self):
ser = websockets.serve(self.handle, "127.0.0.1", "1234")
asyncio.get_event_loop().run_until_complete(ser)
asyncio.get_event_loop().run_forever()
ws = WSserver()
ws.run()
最后将服务器打开 python3 service_web.py 准备测试接收数据
运行fastapi
uvicorn main:app --reload --port 8001
用接口测试工具或者curl
curl 调用接口发数据
curl --location --request POST '127.0.0.1:8001/send' \
--header 'Content-Type: application/json' \
--data-raw '{"datas":"222"}'
fastapi服务打印
Sending ...
Sending Data: 222
Reeiving...
Received 'server send ok' # 服务端回复发送成功
INFO: 127.0.0.1:58950 - "POST /send HTTP/1.1" 200 OK
服务器回复
i received "222
服务端打印收到信息