WebSocket¶
Registro de rutas WS¶
Las rutas WebSocket se registran con @app.ws(path, ...).
@app.ws("/ws/echo", keepalive_interval=30.0, pong_timeout=10.0)
def ws_echo(ws, _request):
while True:
frame = ws.recv_frame()
if frame.opcode == 0x1:
ws.send_text(frame.payload.decode("utf-8", errors="ignore"))
elif frame.opcode == 0x8:
ws.close(1000, "bye")
break
Opciones del decorador¶
| Opcion | Uso |
|---|---|
subprotocols |
lista de subprotocolos soportados |
idle_timeout |
cierre por inactividad |
keepalive_interval |
envio automatico de ping |
pong_timeout |
tiempo maximo esperando pong |
auto_pong |
respuesta automatica a ping |
on_close |
callback al cerrar |
on_error |
callback en error |
on_timeout |
callback en timeout |
io_poll_interval |
granularidad de espera de I/O |
ping_payload |
payload fijo para pings de keepalive |
WebSocket¶
Metodos publicos mas usados:
recv_frame()send_frame(opcode, payload)send_text(text)send_binary(data)send_ping(payload=b"")send_pong(payload=b"")close(code=1000, reason="")
recv_frame() devuelve un WebSocketFrame con opcode, payload, fin y
metadatos del frame leido.
Handshake y utilidades¶
El modulo ws.py tambien expone helpers de bajo nivel:
is_ws_request(headers)handshake_websocket(...)handshake_websocket_with_options(...)read_ws_frame_raw(conn)make_ws_frame_bytes(opcode, payload=b"")parse_close_payload(payload)recv_exact(conn, n)
Son utiles cuando quieres inspeccionar o reutilizar piezas del protocolo sin
pasar por App.
Buenas practicas¶
- Usa
keepalive_intervalypong_timeoutcuando el cliente puede quedar mucho tiempo ocioso. - Trata
opcode == 0x8como cierre ordenado. - Para mensajes de texto, decodifica con tolerancia a errores si el origen no esta completamente controlado.
- Si necesitas limitar trafico o ACL, habilita
SecurityPolicytambien en la aplicacion HTTP; el handshake pasa por la evaluacion de seguridad.