प्रौद्योगिकी साझेदारी

FastAPI शिक्षणमार्ग (44) WebSockets

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

अस्माकं पूर्वविश्लेषणं सर्वं http अनुरोधानाम् आधारेण आसीत्, अतः यदि websockets तस्य समर्थनं कर्तुं शक्नुवन्ति तर्हि उत्तरं हाँ, कथं कार्यान्वयनीयम् इति अवलोकयामः ।

  1. from fastapi import WebSocket, FastAPI
  2. from fastapi.responses import HTMLResponse
  3. app = FastAPI()
  4. html = """
  5. <!DOCTYPE html>
  6. <html>
  7. <head>
  8. <title>Chat</title>
  9. </head>
  10. <body>
  11. <h1>WebSocket 聊天</h1>
  12. <form action="" onsubmit="sendMessage(event)">
  13. <input type="text" id="messageText" autocomplete="off"/>
  14. <button>Send</button>
  15. </form>
  16. <ul id='messages'>
  17. </ul>
  18. <script>
  19. var ws = new WebSocket("ws://localhost:8000/ws");
  20. ws.onmessage = function(event) {
  21. var messages = document.getElementById('messages')
  22. var message = document.createElement('li')
  23. var content = document.createTextNode(event.data)
  24. message.appendChild(content)
  25. messages.appendChild(message)
  26. };
  27. function sendMessage(event) {
  28. var input = document.getElementById("messageText")
  29. ws.send(input.value)
  30. input.value = ''
  31. event.preventDefault()
  32. }
  33. </script>
  34. </body>
  35. </html>
  36. """
  37. @app.get("/")
  38. async def get_page():
  39. return HTMLResponse(html)
  40. @app.websocket("/ws")
  41. async def websocket_endpoint(websocket: WebSocket):
  42. await websocket.accept()
  43. while True:
  44. data = await websocket.receive_text()
  45. await websocket.send_text(f"接收到的消息是:{data}")

वस्तुतः अतीव सरलम् अस्ति । वयं प्राप्तं सन्देशं प्रत्यक्षतया अग्रभागं प्रति प्रत्यागच्छामः।

प्रभावं अवलोकयामः : १.

एवं वयं केवलं websocket इत्यस्य कार्यं कार्यान्वयामः । अतः अस्माकं विशिष्टः सन्देशः अस्ति तथा च वयं गपशपं बन्दं कुर्मः, तस्य निवारणं कथं कर्तव्यम्?

  1. # 接收特定的消息后,终止该聊天
  2. @app.websocket("/ws")
  3. async def websocket_endpoint(websocket: WebSocket):
  4. await websocket.accept()
  5. while True:
  6. data = await websocket.receive_text()
  7. if data == "bye":
  8. await websocket.send_text(f"请注意:窗口即将关闭")
  9. await websocket.send_text("窗口已关闭")
  10. await websocket.close()
  11. break
  12. else:
  13. await websocket.send_text(f"接收到的消息是:{data}")

अग्रभागस्य कोडः परिवर्तितः नास्ति, केवलं पृष्ठभागस्य परिवर्तनं कृतम् अस्ति ।

वस्तुतः अत्र websocket संचारस्य कार्यान्वयनम् अतीव सरलम् अस्ति ।

अवश्यं वयं अनुरोधेषु अपि तस्य उपयोगं कर्तुं शक्नुमः

  • आश्रित्य भवति
  • सुरक्षा
  • कुकी
  • शीर्षकम्
  • पथं
  • उत्प्रेक्षा

सरलस्य पृष्ठभागस्य लेखनस्य निम्नलिखितम् उदाहरणं वयं पश्यितुं शक्नुमः

  1. # 使用多种参数,比如获取cookie等
  2. from typing import Optional
  3. from fastapi import Cookie, Query, status, Depends
  4. async def get_cookie_or_token(
  5. websocket: WebSocket,
  6. session: Optional[str] = Cookie(None),
  7. token: Optional[str] = Query(None),
  8. ):
  9. if session is None and token is None:
  10. await websocket.close(code=status.WS_1008_POLICY_VIOLATION)
  11. return session or token
  12. @app.websocket("item/ws")
  13. async def websocket_endpoint(
  14. websocket: WebSocket,
  15. q: Optional[int] = None,
  16. cookie_or_token: str = Depends(get_cookie_or_token),
  17. ):
  18. await websocket.accept()
  19. while True:
  20. data = await websocket.receive_text()
  21. await websocket.send_text(
  22. f"Session cookie or query token value is: {cookie_or_token}"
  23. )
  24. if q is not None:
  25. await websocket.send_text(f"parameter q is: {q}")
  26. await websocket.send_text(f"Message text was: {data}, for : {q}")

यद्यपि वयं केवलं पृष्ठभागं कार्यान्वितवन्तः तथापि fastapi इत्यत्र websocket इत्यस्य उत्तमं समर्थनम् अस्ति इति वयं द्रष्टुं शक्नुमः