콘텐츠로 이동

WebSockets

Starlette에는 WebSocket HTTP 요청과 같은 기능을 하지만 웹 소켓에서 데이터를 보내고 받을 수 있는 클래스입니다.

웹 소켓

서명: WebSocket(scope, receive=None, send=None)

스타렛에서.웹 소켓 가져오기 웹 소켓


비동기 def 앱(범위, 수신, 전송):
    웹 소켓 = 웹 소켓 (범위 = 범위, 수신 = 수신, 송신 = 송신)
    웹소켓을 기다리세요. 수락하세요 ()
    웹 소켓을 기다립니다. send_gate ('안녕하세요, 세상!')
    웹소켓을 기다리세요. 닫으세요 ()

웹 소켓은 매핑 인터페이스를 제공하므로 scope 와 마찬가지로 사용할 수 있습니다.

예를 들어 websocket['path'] 는 ASGI 경로를 반환합니다.

균일한 리소스 로케이터(일반적으로 URL이라고도 함)

WebSocket URL은 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 메시지는 기본적으로 텍스트 데이터 프레임으로 전송됩니다.websocket.send_json(data, mode="binary") 를 사용하여 JSON을 이진 데이터 프레임으로 보냅니다.

데이터 받기

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

"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 와 유사하지만 비동기 반복기를 반환합니다.

스타렛에서.웹 소켓 가져오기 웹 소켓


비동기 def 앱(범위, 수신, 전송):
    웹 소켓 = 웹 소켓 (범위 = 범위, 수신 = 수신, 송신 = 송신)
    웹소켓을 기다리세요. 수락하세요 ()
    웹 소켓의 메시지에 대한 비동기화. iter_텍스트():
        웹소켓 send_gate를 기다립니다(f "메시지 텍스트는:{message}")
    웹소켓을 기다리세요. 닫으세요 ()

starlette.websockets.WebSocketDisconnect 가 승격되면 반복기가 종료됩니다.

가까운 연결

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

메시지 보내기 및 받기

원시 ASGI 메시지를 보내거나 받아야 하는 경우 원시 send 및 receive 콜러블 대신 websocket.send() 및 websocket.receive() 를 사용해야 합니다. 이렇게 하면 WebSocket의 상태가 올바르게 업데이트됩니다.

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

거부 응답 보내기

websocket.accept() 를 호출하기 전에 websocket.close() 에 전화하면 서버가 자동으로 HTTP 403 오류를 클라이언트 측으로 보냅니다.

다른 오류 응답을 보내려면 websocket.send_denial_response() 방법을 사용할 수 있습니다. 응답을 보낸 다음 연결을 닫습니다.

  • await websocket.send_denial_response(response)

이를 위해서는 ASGI 서버가 WebSocket 거부 응답 확장을 지원해야 합니다. 그렇지 않으면 RuntimeError 오류가 발생합니다.