FastAPI Websocket не закрывается или не вызывает исключение после закрытия связанного Flutter WebsocketPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 FastAPI Websocket не закрывается или не вызывает исключение после закрытия связанного Flutter Websocket

Сообщение Anonymous »

Обзор
Я интегрирую конечную точку FastAPI с Flutter, в которой устанавливаю соединение Websocket. После этого интерфейс Flutter закрывает соединение Websocket нажатием кнопки.
Что должно произойти, так это соединение Websocket со стороны FastAPI также закрывается, но Websocket не закрывается, и исключение WebSocketDisconnectException не возникает, хотя веб-сокет Flutter сигнализируется как закрытый.
Кроме того, состояние клиента веб-сокета остается ПОДКЛЮЧЕННЫМ, даже если я закрыл это.
Код Flutter Websocket

Код: Выделить всё

class RealtimeDataService {
WebSocketChannel? channel;
void start(StreamController controller, String cameraID) async {
channel = WebSocketChannel.connect(
Uri.parse('ws://localhost:8001/camera/$cameraID'),
);
channel!.stream.listen((event) async {
Map data = bson.BsonCodec.deserialize(bson.BsonBinary.from(event));
controller.add(data);
});
}

void stop() {
if (channel == null) return;
channel!.sink.close();
channel = null;
}
}
Код веб-сокета FastAPI

Код: Выделить всё

@app.websocket("/camera/{camera_id}")
async def read_camera(websocket: WebSocket, camera_id: int):
await websocket.accept()

try:
while True:
# print(websocket.client_state.name)
print('Running') # Suggested solution from Edit 1
await asyncio.sleep(0.1) # Suggested solution from Edit 1
except WebSocketDisconnect:
print('Client disconnected')
raise HTTPException(status_code=200, detail="Client disconnected")
except:
print('Error capturing camera')
await websocket.close()
raise HTTPException(status_code=200, detail="Camera is not available")
Я пробовал получать сообщения через веб-сокет FastAPI и пытался перехватить исключение, возникающее при попытке отправить сообщение через веб-сокет, который закрыт, но, похоже, ничего не изменилось. результат.
Мало того, что веб-сокет не закрывается, я не могу закрыть сервер FastAPI с помощью «CTRL + C».
Что мне нужно, так это после веб-сокета Flutter закрыто, FastAPI также будет закрыт, чтобы я мог позже повторно подключиться, если потребуется, или просто выполнить другие действия.
Изменить 1
Попробовал добавить ожидание asyncio.sleep(0.1) (и оператор печати, чтобы знать, что он запущен) в цикл while True, но проблема остается. Ниже я добавлю два снимка экрана, демонстрирующих поведение этого решения на данный момент.
Предполагаемый результат заключается в том, чтобы после закрытия веб-сокета со стороны Flutter, как показано на первом снимке экрана, , процесс также прекращает работу.
Вывод до и после закрытия сокета со стороны Flutter.
Изображение

Вывод после двухкратного нажатия CTRL+C.
Изображение


Подробнее здесь: https://stackoverflow.com/questions/789 ... associated
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»