fastapi实现websocket

fastapi实现websocket

websockets.py

主要实现了部分房间进行聊天的功能以及在房间进行某种举动之后的操作
注:不是很完善后续将进行补充

import json, os
from select import select
from typing import Dict

from fastapi import APIRouter, Depends, WebSocket, WebSocketDisconnect
from sqlalchemy.orm import Session
from starlette.requests import Request
from http import HTTPStatus
from fastapi.responses import HTMLResponse
from models.users import Room

from settings.settings import get_db
from crud.users import get_users, get_user, get_mobile_user, create_user, delete_user
from schemas import users as schemas_user
# from schemas.users import * 
from utils.jwt import *
from utils.redis_utils import redis_get_msg, redis_set_msg, redis
from config.databases import REDIS_DATABASES_URL

## html在页面上做显示的用途
html = """
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>websocket</title>
    </head>
    <body>
    <h1>User1 Chat</h1>
    <form action="" οnsubmit="sendMessage(event)">
        <input type="text" id="messageText" autocomplete="off"/>
        <button>Send</button>
    </form>
    <ul id='messages'>
    </ul>

    <script>
        var ws = new WebSocket("ws://127.0.0.1:8888/v1/test/");

        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>

"""
## 注册子路由
router = APIRouter()

## 定义聊天类
class ConnectionManager:
	## 初始化定义记录全部的链接
    def __init__(self):
        self.active_connections: List[WebSocket] = []
        self.sessions = dict()
	
	##
    async def connect(self, ws: WebSocket):
        await ws.accept()
        self.active_connections.append(ws)

    def disconnect(self, ws: WebSocket):
        self.active_connections.remove(ws)
    
    ## 关闭链接时的动作
    async def on_close(self, websocket: WebSocket, close_code: int):
        await websocket.close(close_code)
        self.active_connections.remove(websocket)
	
	
    @staticmethod
    async def send_personal_message(message: str, ws: WebSocket):
        await ws.send_text(message)
    
    ## 点对点的操作
    @staticmethod
    async def send_user_message(message: str, ws: WebSocket):
        await ws.send_text(message)
	
	## 广播信息的操作
    async def broadcast(self, message: str):
        for connection in self.active_connections:
            await connection.send_text(message)
	
	## 解析关键词
    async def filter_message(self, message:str
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FastAPI WebSocketFastAPI框架的一部分,它允许在应用程序中实现基于WebSocket的实时通信。它基于标准的Python异步框架,具有高性能和易用性的特点。 使用FastAPI WebSocket,您可以轻松地构建具有实时功能的应用程序,例如聊天应用程序、实时博客评论和在线协作工具等。FastAPI WebSocket使用asyncio库和websockets库来实现WebSocket协议。 要使用FastAPI WebSocket,您需要在FastAPI应用程序中添加一个WebSocket路由。您可以使用async def函数将WebSocket请求处理程序添加到路由中,该函数将处理来自客户端的WebSocket消息,并向客户端发送消息。FastAPI WebSocket还提供了一个WebSocket连接上下文,允许您跟踪每个连接的状态并处理连接事件。 以下是一个使用FastAPI WebSocket的示例代码: ```python from fastapi import FastAPI, WebSocket app = FastAPI() @app.websocket("/ws") async def websocket_endpoint(websocket: WebSocket): await websocket.accept() while True: data = await websocket.receive_text() await websocket.send_text(f"You said: {data}") ``` 上面的代码将在应用程序中添加一个WebSocket路由,并在该路由中定义一个名为websocket_endpoint的async def函数来处理WebSocket请求。当客户端建立WebSocket连接时,该函数将使用accept()方法接受连接,并进入一个循环以处理来自客户端的消息。当客户端发送文本消息时,该函数将使用receive_text()方法接收消息,并使用send_text()方法向客户端发送回复。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值