le mie informazioni di contatto
Posta[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
La nostra analisi precedente era tutta basata su richieste http, quindi se i websocket possono supportarlo, la risposta è sì, diamo un'occhiata a come implementarlo.
- 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}")
In effetti, è molto semplice. Scriviamo un'interfaccia per ricevere i messaggi sul back-end. Quando arriva un messaggio, lo elaboriamo. Prima era gestito da http, ma ora è websocket. Abbiamo restituito il messaggio ricevuto direttamente al front-end.
Diamo un’occhiata all’effetto:
In questo modo implementiamo semplicemente la funzione di un websocket. Quindi abbiamo un messaggio specifico e chiudiamo la chat, come affrontarlo?
- # 接收特定的消息后,终止该聊天
- @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}")
Il codice front-end non è stato modificato, è stato modificato solo il back-end.
In effetti, è molto semplice implementare qui la comunicazione websocket.
Naturalmente possiamo usarlo anche nelle richieste
Possiamo osservare il seguente esempio di semplice scrittura del backend
- # 使用多种参数,比如获取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}")
Anche se abbiamo semplicemente implementato il backend, possiamo vedere che fastapi ha un buon supporto per websocket