2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
अस्माकं पूर्वविश्लेषणं सर्वं http अनुरोधानाम् आधारेण आसीत्, अतः यदि websockets तस्य समर्थनं कर्तुं शक्नुवन्ति तर्हि उत्तरं हाँ, कथं कार्यान्वयनीयम् इति अवलोकयामः ।
- from fastapi import WebSocket, FastAPI
- from fastapi.responses import HTMLResponse
-
- app = FastAPI()
-
- html = """
-
- <!DOCTYPE html>
-
- <html>
-
- <head>
-
- <title>Chat</title>
-
- </head>
-
- <body>
-
- <h1>WebSocket 聊天</h1>
-
- <form action="" onsubmit="sendMessage(event)">
-
- <input type="text" id="messageText" autocomplete="off"/>
-
- <button>Send</button>
-
- </form>
-
- <ul id='messages'>
-
- </ul>
-
- <script>
-
- var ws = new WebSocket("ws://localhost:8000/ws");
-
- 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>
-
- """
-
-
- @app.get("/")
- async def get_page():
- return HTMLResponse(html)
-
-
- @app.websocket("/ws")
- async def websocket_endpoint(websocket: WebSocket):
- await websocket.accept()
- while True:
- data = await websocket.receive_text()
- await websocket.send_text(f"接收到的消息是:{data}")
वस्तुतः अतीव सरलम् अस्ति । वयं प्राप्तं सन्देशं प्रत्यक्षतया अग्रभागं प्रति प्रत्यागच्छामः।
प्रभावं अवलोकयामः : १.
एवं वयं केवलं websocket इत्यस्य कार्यं कार्यान्वयामः । अतः अस्माकं विशिष्टः सन्देशः अस्ति तथा च वयं गपशपं बन्दं कुर्मः, तस्य निवारणं कथं कर्तव्यम्?
- # 接收特定的消息后,终止该聊天
- @app.websocket("/ws")
- async def websocket_endpoint(websocket: WebSocket):
- await websocket.accept()
- while True:
- data = await websocket.receive_text()
- if data == "bye":
- await websocket.send_text(f"请注意:窗口即将关闭")
- await websocket.send_text("窗口已关闭")
- await websocket.close()
- break
- else:
- await websocket.send_text(f"接收到的消息是:{data}")
अग्रभागस्य कोडः परिवर्तितः नास्ति, केवलं पृष्ठभागस्य परिवर्तनं कृतम् अस्ति ।
वस्तुतः अत्र websocket संचारस्य कार्यान्वयनम् अतीव सरलम् अस्ति ।
अवश्यं वयं अनुरोधेषु अपि तस्य उपयोगं कर्तुं शक्नुमः
सरलस्य पृष्ठभागस्य लेखनस्य निम्नलिखितम् उदाहरणं वयं पश्यितुं शक्नुमः
- # 使用多种参数,比如获取cookie等
- from typing import Optional
- from fastapi import Cookie, Query, status, Depends
-
-
- async def get_cookie_or_token(
- websocket: WebSocket,
- session: Optional[str] = Cookie(None),
- token: Optional[str] = Query(None),
- ):
- if session is None and token is None:
- await websocket.close(code=status.WS_1008_POLICY_VIOLATION)
- return session or token
-
-
- @app.websocket("item/ws")
- async def websocket_endpoint(
- websocket: WebSocket,
- q: Optional[int] = None,
- cookie_or_token: str = Depends(get_cookie_or_token),
- ):
- await websocket.accept()
- while True:
- data = await websocket.receive_text()
- await websocket.send_text(
- f"Session cookie or query token value is: {cookie_or_token}"
- )
- if q is not None:
- await websocket.send_text(f"parameter q is: {q}")
- await websocket.send_text(f"Message text was: {data}, for : {q}")
यद्यपि वयं केवलं पृष्ठभागं कार्यान्वितवन्तः तथापि fastapi इत्यत्र websocket इत्यस्य उत्तमं समर्थनम् अस्ति इति वयं द्रष्टुं शक्नुमः