Исключение WebSocketDisconnect
Исключение WebSocketDisconnect применяется
для обработки ситуаций, когда WebSocket-соединение
было разорвано со стороны клиента. Оно наследуется
от класса Exception и возбуждается внутри
WebSocket-эндпоинта при попытке чтения данных
из закрытого соединения. Исключение содержит
атрибут code, в котором хранится код
закрытия соединения.
Для корректной обработки разрыва соединения
исключение WebSocketDisconnect следует
перехватывать в блоке try/except
внутри обработчика WebSocket-маршрута.
Синтаксис
from fastapi import WebSocketDisconnect
try:
await websocket.receive_text()
except WebSocketDisconnect as exc:
# handle disconnection
print(exc.code)
Пример
Давайте создадим WebSocket-эндпоинт, который принимает сообщения и корректно обрабатывает разрыв соединения:
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
app = FastAPI()
@app.websocket('/ws')
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
try:
while True:
data = await websocket.receive_text()
await websocket.send_text(f'echo: {data}')
except WebSocketDisconnect as exc:
print(f'client disconnected: {exc.code}')
При подключении клиент получает ответное
сообщение с префиксом 'echo:'.
При отключении в консоль сервера выводится
код закрытия соединения.
Пример
Давайте перехватим исключение и отправим информацию о разрыве всем остальным клиентам:
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
app = FastAPI()
clients = []
@app.websocket('/chat')
async def chat(websocket: WebSocket):
await websocket.accept()
clients.append(websocket)
try:
while True:
msg = await websocket.receive_text()
for client in clients:
await client.send_text(msg)
except WebSocketDisconnect as exc:
clients.remove(websocket)
for client in clients:
await client.send_text(f'user left: {exc.code}')
После отключения одного из клиентов остальные получат сообщение с кодом закрытия соединения.
Смотрите также
-
исключение
WebSocketException,
которое возбуждается для отправки ошибки клиенту -
атрибут
code,
который хранит код закрытия WebSocket-соединения -
атрибут
reason,
который содержит причину закрытия соединения -
исключение
WebSocketRequestValidationError,
которое возникает при ошибке валидации WebSocket-запроса