Перейти к содержанию

WebSockets

Starlette содержит один WebSocket Класс, который действует аналогично HTTP-запросам, но позволяет отправлять и получать данные через WebSocket.

WebSocket

Подпись: WebSocket(scope, receive=None, send=None)

Из Starlette.websockets import WebSocket


async def app(scope, receive, send):
    WebSocket = WebSocket(scope=scope, receive= proceive, send=send)
    websocket.accept()
    await websocket.send_text ('Hello, world!')
    websocket.close (

WebSockets предоставляет интерфейс для отображения, поэтому вы можете использовать их так же, как и scope.

Например,websocket['path'] возвращает путь ASGI.

Унифицированный указатель ресурсов (часто называемый также URL).

URL-адреса WebSocket доступны через websocket.url.

Это свойство фактически является подклассом str, а также предоставляет информацию о всех компонентах, которые могут быть разрешены из URL-адреса.

Например,websocket.url.path,websocket.url.port,websocket.url.scheme.

Заголовок сообщения

Заголовок отображается как несколько словарей, не зависящих от регистра.

Например: websocket.headers['sec-websocket-version']

Параметры запроса

Параметры запроса представлены в виде неизменяемых множественных словарей.

Например: websocket.query_params['search']

Параметры траектории

Параметры пути маршрутизатора раскрываются в качестве интерфейса словаря.

Например: websocket.path_params['username']

Принять соединение

  • await websocket.accept(subprotocol=None, headers=None)

Отправить данные

  • await websocket.send_text(data)
  • await websocket.send_bytes(data)
  • await websocket.send_json(data)

Начиная с версии 0.10.0 сообщения JSON отправляются по умолчанию через текстовые кадры данных. JSON отправляется через двоичные кадры данных с помощью websocket.send_json(data, mode="binary").

Получение данных

  • await websocket.receive_text()
  • await websocket.receive_bytes()
  • await websocket.receive_json()

Текст «May raise starlette.websockets.WebSocketDisconnect()» кажется менее подходящим для правильного перевода на китайский язык. Если у вас есть больше контекстуальной информации или подтверждение точности содержания текста, я постараюсь предоставить вам более удовлетворительный перевод. В настоящее время он может быть переведен только на «Может быть улучшен starlette.websockets.WebSocketDisconnect()». Но этот перевод может быть не совсем реалистичным.

Начиная с версии 0.10.0 сообщения JSON по умолчанию принимаются через текстовые кадры данных. Использование websocket.receive_json(data, mode="binary") позволяет получать JSON через двоичные кадры данных.

итеративные данные

  • websocket.iter_text()
  • websocket.iter_bytes()
  • websocket.iter_json()

Похожие на receive_text,receive_bytes и receive_json, но возвращает асинхронный итератор.

Из Starlette.websockets import WebSocket


async def app(scope, receive, send):
    WebSocket = WebSocket(scope=scope, receive= proceive, send=send)
    websocket.accept()
    async for message in websocket.iter_text ():
        websocket.send_text (f"Message text was:{message}")
    websocket.close (

Когда starlette.websockets.WebSocketDisconnect поднимается, итератор выходит.

Закрыть соединение

  • await websocket.close(code=1000, reason=None)

Отправка и получение сообщений

Если вам нужно отправлять или получать оригинальные сообщения ASGI, то вам следует использовать websocket.send() и websocket.receive() вместо оригинальных вызываемых объектов send и receive. Это гарантирует, что состояние WebSocket будет обновлено правильно.

  • await websocket.send(message)
  • await websocket.receive()

Отправить ответ об отказе

Если вы вызываете websocket.close() перед вызовом websocket.accept(), сервер автоматически отправляет клиенту ошибку HTTP 403.

Если вы хотите отправить другой ответ на ошибку, вы можете использовать метод websocket.send_denial_response(). Это отправит ответ и затем закроет соединение.

  • await websocket.send_denial_response(response)

Это требует, чтобы сервер ASGI поддерживал расширение WebSocket. Если это не поддерживает, это вызовет ошибку RuntimeError.