代码先锋网 代码片段及技术文章聚合

Fastapi Websocket 简明使用

技术标签: websocket  python  后端

Fastapi Websocket 简明使用

  • 1.基于Fastapi 开发websocket 服务器端
  • 2.基于Fastapi 开发websocket 客户端
    在这里插入图片描述

环境

	 pip install fastapi[all] websocket-client -i https://pypi.doubanio.com/simple

基于fastapi 实现 weboskcet

  • main.py
from typing import List

from fastapi import FastAPI, WebSocket, WebSocketDisconnect
from fastapi.responses import HTMLResponse

app = FastAPI()

html = """
<!DOCTYPE html>
<html>
    <head>
        <title>Chat</title>
    </head>
    <body>
        <h1>WebSocket Chat</h1>
        <h2>Your ID: <span id="ws-id"></span></h2>
        <form action="" οnsubmit="sendMessage(event)">
            <input type="text" id="messageText" autocomplete="off"/>
            <button>Send</button>
        </form>
        <ul id='messages'>
        </ul>
        <script>
            var client_id = Date.now()
            document.querySelector("#ws-id").textContent = client_id;
            var ws = new WebSocket(`ws://192.168.144.81:8000/ws/${client_id}`);
            ws.onmessage = function(event) {
                var messages = document.getElementById('messages')
                var message = document.createElement('li')
                var content = document.createTextNode(event.data)
                message.appendChild(content)
                messages.appendChild(message)
            };
            function sendMessage(event) {
                var input = document.getElementById("messageText")
                ws.send(input.value)
                input.value = ''
                event.preventDefault()
            }
        </script>
    </body>
</html>
"""


class ConnectionManager:
    def __init__(self):
        self.active_connections: List[WebSocket] = []

    async def connect(self, websocket: WebSocket):
        await websocket.accept()
        self.active_connections.append(websocket)

    def disconnect(self, websocket: WebSocket):
        self.active_connections.remove(websocket)

    async def send_personal_message(self, message: str, websocket: WebSocket):
        await websocket.send_text(message)

    async def broadcast(self, message: str):
        for connection in self.active_connections:
            await connection.send_text(message)


manager = ConnectionManager()


@app.get("/")
async def get():
    return HTMLResponse(html)


@app.websocket("/ws/{client_id}")
async def websocket_endpoint(websocket: WebSocket, client_id: int):
    await manager.connect(websocket)
    try:
        while True:
            data = await websocket.receive_text()

            await manager.send_personal_message(f"You wrote: {data}", websocket)
            await manager.broadcast(f"Client #{client_id} says: {data}")
    except WebSocketDisconnect:
        manager.disconnect(websocket)
        await manager.broadcast(f"Client #{client_id} left the chat")

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(
        app='main:app', 
        host="0.0.0.0",
        log_level="debug", 
        port=8000,
        loop="asyncio",
        # workers=4,
    )
  • client.py
from fastapi import FastAPI,BackgroundTasks
from starlette.concurrency import run_in_threadpool
def create_app():
    app = FastAPI()
    return app

app = create_app()

@app.on_event("startup")
async def init_scheduler():
    from task import run
    run()
   
    

if __name__ =='__main__':
    import uvicorn
    uvicorn.run(
        app='client:app', 
        host="0.0.0.0",
        log_level="debug", 
        port=8888,
        loop="asyncio",
        # workers=4,
    )
  • task.py
import websocket
import threading, time

def on_close(ws):
	'''
		- websocket client 重试机制
	'''
    print ("Retry : %s" % time.ctime())
    time.sleep(2)
    connect_websocket() # 每2s 重试一次
def on_open(ws):
	'''
		- 当系统连接上后的提示
	'''
    print('connection established')

def on_message(wsapp, message):
	'''
		- 接收服务器websocket 发送来的消息
	'''
    print(message)

def connect_websocket():
	'''
		- 尝试连接websocket 服务器
		- 并给该线程设置守护
	'''
    ws = websocket.WebSocketApp(
        "ws://192.168.144.81:8000/ws/2323", 
        on_open = on_open, 
        on_close = on_close,
        cookie="chocolate",
        on_message=on_message
        )
    wst = threading.Thread(target=ws.run_forever)
    wst.daemon = True
    wst.start()

def run():
'''
	- websocket 组件会跟随fastapi 主进程启动
	- 客户端系统会每隔2s 尝试一次连接
'''
    try:
        connect_websocket()
    except Exception as err:
        print(err)
        print("connect failed")

在这里插入图片描述在这里插入图片描述

版权声明:本文为qq_37721213原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_37721213/article/details/115058858

智能推荐

fastapi 基础使用

 官网地址:https://github.com/tiangolo/fastapi  在项目目录下面构建一个main.py的文件,文件中存在下述内容:  特别需要注意的是:声明app的文件是main.py,所以最后一行uvicorn.run里面是app='main:app',面是如果声明app的文件是xxx.py,则此处需要修改为app='xxx:app' 在VsCo...

fastAPI使用mongoDB

我用的是mongoengine 先 pip install mongoengine 编写ORM模型: mongoDB信息: 启动文件中: views中增删改查: 更多操作 见上面的官网文档...

fastapi使用记录

Fastapi基础快速应用 安装 demo.py 运行...

fastapi参数的使用

1、Response Response可用于设置接口返回的status_code码,例如 当走进if时,会返回状态码222以及detail的信息 2、Body 当需要取Body中的数据时,在参数类型后加 = Body(...)便可获取到Body中的数据,注意参数名与Body中的参数名一致: 3、Cookie 当需要从Cookie中取数据时,参数可以这样写:uuid: Optional[str]=C...

fastapi

fastapi介绍(一):fastapi简介+环境安装   文档: https://fastapi.tiangolo.com 源码: https://github.com/tiangolo/fastapi 一、什么是fastapi? FastAPI是一个现代的,快速(高性能)python web框架。基于标准的python类型提示,使用python3.6+构建API的Web框架。 The...

猜你喜欢

FastApi

函数参数将依次按如下规则进行识别: 如果在路径中也声明了该参数,它将被用作路径参数。 如果参数属于单一类型(比如 int、float、str、bool 等)它将被解释为查询参数。 如果参数的类型被声明为一个 Pydantic 模型,它将被解释为请求体 传递 * 作为函数的第一个参数。 Python 不会对该 * 做任何事情,但是它将知道之后的所有参数都应作为关键字参数(键值对),也被称为 kwar...

FASTAPI

临时文件夹创建 MD5方法...

python websocket-http实现fastapi-sse

实现目的: 因为项目从flask迁移到fastapi上,导致flask-sse无法使用 期间尝试了很多websocket相关库如: 期间踩了无数坑 后来发现了websocket-client库 第一步 搭建简单的fastapi 服务 第二步 搭建 websock客户端,用来创建websocket对象,实现长连接方式 client-server.py 第三步 搭建websocket服务端 用来测试是...

fastapi 基本部署使用

基本包: 在centos7.6 下,安装了python3.8 版本,同时与python2 共存,因此安装fastapi的时候,应该使用pip3 进行安装 安装的模块: 基本main.py 文件 启动 python3 main.py 默认python为2的版本,系统自带不支持 uvicorn main:app --reload 3.前两个都是阻塞式的,并且在控制台关闭之后,程序也就关闭了。使用gun...

Python fastapi的简单使用

brief FastAPI is a modern, fast (high-performance), web framework for building APIs with Python 3.6+ based on standard Python type hints. The key features are: Fast: Very high performance, on par with...