当前位置:   article > 正文

超简单的fastapi链接websocket用例_fastapi websocket

fastapi websocket

main.py

  1. from typing import List
  2. from fastapi import FastAPI, WebSocket, WebSocketDisconnect
  3. app = FastAPI()
  4. class ConnectionManager:
  5. def __init__(self):
  6. # 存放激活的ws连接对象
  7. self.active_connections: List[WebSocket] = []
  8. async def connect(self, ws: WebSocket):
  9. # 等待连接
  10. await ws.accept()
  11. # 存储ws连接对象
  12. self.active_connections.append(ws)
  13. def disconnect(self, ws: WebSocket):
  14. # 关闭时 移除ws对象
  15. self.active_connections.remove(ws)
  16. @staticmethod
  17. async def send_personal_message(message: str, ws: WebSocket):
  18. # 发送个人消息
  19. await ws.send_text(message)
  20. async def broadcast(self, message: str):
  21. # 广播消息
  22. for connection in self.active_connections:
  23. await connection.send_text(message)
  24. manager = ConnectionManager()
  25. @app.websocket("/ws/{user}")
  26. async def websocket_endpoint(websocket: WebSocket, user: str):
  27. await manager.connect(websocket)
  28. await manager.broadcast(f"用户{user}进入聊天室")
  29. try:
  30. while True:
  31. data = await websocket.receive_text()
  32. await manager.send_personal_message(f"你说了: {data}", websocket)
  33. await manager.broadcast(f"用户:{user} 说: {data}")
  34. except WebSocketDisconnect:
  35. manager.disconnect(websocket)
  36. await manager.broadcast(f"用户-{user}-离开")
  37. if __name__ == "__main__":
  38. import uvicorn
  39. # 官方推荐是用命令后启动 uvicorn main:app --host=127.0.0.1 --port=8010 --reload
  40. uvicorn.run(app='main:app', host="127.0.0.1", port=8010, reload=True, debug=True)

chat.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>聊天1</title>
  6. </head>
  7. <body>
  8. <h1>User{{id}} Chat</h1>
  9. <form action="" onsubmit="sendMessage(event)">
  10. <input type="text" id="messageText" autocomplete="off"/>
  11. <button>Send</button>
  12. </form>
  13. <ul id='messages'>
  14. </ul>
  15. <script>
  16. var ws = new WebSocket("ws://127.0.0.1:5200/api/chat/ws/user{{id}}");
  17. ws.onmessage = function(event) {
  18. var messages = document.getElementById('messages')
  19. var message = document.createElement('li')
  20. var content = document.createTextNode(event.data)
  21. message.appendChild(content)
  22. messages.appendChild(message)
  23. };
  24. function sendMessage(event) {
  25. var input = document.getElementById("messageText")
  26. ws.send(input.value)
  27. input.value = ''
  28. event.preventDefault()
  29. }
  30. </script>
  31. </body>
  32. </html>

以上部分是案例

此处是个人案例  通过http传递用户协议到jinjia2模板进行html渲染

  1. from fastapi import APIRouter,WebSocket,WebSocketDisconnect
  2. from app1.core.websocket_config import manager
  3. from starlette.requests import Request
  4. from starlette.staticfiles import StaticFiles
  5. from starlette.templating import Jinja2Templates
  6. chat_routing=APIRouter(prefix='/chat')
  7. @chat_routing.websocket("/ws/{user}")
  8. async def websocket_endpoint(websocket: WebSocket, user: str):
  9. await manager.connect(websocket)
  10. await manager.broadcast(f"用户{user}进入聊天室")
  11. try:
  12. while True:
  13. data = await websocket.receive_text()
  14. await manager.send_personal_message(f"你说了: {data}", websocket)
  15. await manager.broadcast(f"用户:{user} 说: {data}")
  16. except WebSocketDisconnect:
  17. manager.disconnect(websocket)
  18. await manager.broadcast(f"用户-{user}-离开")
  19. templates = Jinja2Templates(directory="templates")
  20. @chat_routing.get("/chat/{id}")
  21. async def read_item(request: Request, id: str):
  22. return templates.TemplateResponse("chat.html", {"request": request, "id": id})

html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>聊天1</title>
  6. </head>
  7. <body>
  8. <h1>User{{id}} Chat</h1>
  9. <form action="" onsubmit="sendMessage(event)">
  10. <input type="text" id="messageText" autocomplete="off"/>
  11. <button>Send</button>
  12. </form>
  13. <ul id='messages'>
  14. </ul>
  15. <script>
  16. var ws = new WebSocket("ws://127.0.0.1:5200/api/chat/ws/user{{id}}");
  17. ws.onmessage = function(event) {
  18. var messages = document.getElementById('messages')
  19. var message = document.createElement('li')
  20. var content = document.createTextNode(event.data)
  21. message.appendChild(content)
  22. messages.appendChild(message)
  23. };
  24. function sendMessage(event) {
  25. var input = document.getElementById("messageText")
  26. ws.send(input.value)
  27. input.value = ''
  28. event.preventDefault()
  29. }
  30. </script>
  31. </body>
  32. </html>

https://www.cnblogs.com/CharmCode/p/13552551.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/819497
推荐阅读
相关标签
  

闽ICP备14008679号