FastAPI WebSocket: endpoints, broadcast e testes

FastAPI WebSocket

FastAPI WebSocket: endpoint, gerenciador de broadcast e testes | We.Inc

Crie um endpoint WebSocket no FastAPI, faça broadcast para todos os clientes com um connection manager, leia tokens da query string, trate desconexões e teste tudo com o TestClient.

No FastAPI, você declara uma rota de socket com @app.websocket("/ws") e uma função async que recebe um WebSocket. Chame await websocket.accept() e depois faça um loop com receive_text() e send_text(). Capture WebSocketDisconnect para limpar tudo quando um cliente sair. Instale antes o pacote websockets e teste com TestClient.websocket_connect().

Os métodos de WebSocket que você mais vai chamar

O gerador de endpoint abaixo escreve um main.py funcional a partir de algumas escolhas: o caminho da rota, se as mensagens são texto simples ou JSON, se todo cliente recebe todas as mensagens e se um token precisa chegar na query string. Um arquivo pytest correspondente vem junto. Cada opção corresponde a um padrão da documentação do FastAPI, reescrito aqui como um único arquivo executável.

Perguntas frequentes

Por que o meu WebSocket no FastAPI retorna 404 ou não faz o upgrade?

Comece pela instalação: a documentação de WebSocket do FastAPI pede que você adicione o pacote websockets junto com o FastAPI. Depois confira o caminho, porque uma rota declarada com @app.websocket só responde a upgrades de socket, nunca a GETs HTTP comuns. Fechar o socket antes do accept() também aparece como um handshake recusado (HTTP 403).

Como faço broadcast de uma mensagem para todos os clientes?

Guarde os sockets aceitos em uma lista dentro de uma pequena classe gerenciadora, adicione na conexão, remova na desconexão e percorra a lista chamando send_text. O gerador acima produz exatamente isso quando você marca a opção de broadcast.

O broadcast funciona com vários workers do Uvicorn?

Não com uma lista em memória. Cada worker é um processo separado com a própria lista. A documentação do FastAPI indica o encode/broadcaster, que retransmite as mensagens via Redis ou PostgreSQL para que todo processo receba todas as mensagens.

Posso usar Depends e Query em uma rota WebSocket?

Sim. Endpoints WebSocket aceitam Depends, Query, Cookie, Header, Path e Security assim como as rotas HTTP, então uma dependência de autenticação pode ser compartilhada entre os dois.

Como testo um endpoint WebSocket?

Crie um TestClient para o app e abra o socket em um bloco with usando client.websocket_connect("/ws"). Dentro dele, send_text e receive_text conduzem a conversa, e sair do bloco fecha a conexão.

O que o loop do endpoint está fazendo

Autenticação antes do accept

O menor endpoint funcional

main.py: echo

Aceite e depois devolva cada mensagem até o cliente se desconectar.

Broadcast com um connection manager

Uma classe gerenciadora compartilhada por todas as conexões

Funciona para um único processo. Troque a lista por um relay com Redis antes de escalar horizontalmente.

Testando com o TestClient

Não precisa de servidor: o cliente conversa com o app no mesmo processo. Rode com pytest.

Gerador de endpoint WebSocket para FastAPI

Escolha como o endpoint deve se comportar e copie um main.py completo e um arquivo pytest que o verifica.

Formato da mensagem

Texto simples

JSON

Enviar cada mensagem para todos os clientes conectados

Exigir um token na query string (?token=...)

Rode: fastapi dev main.py, e depois conecte em ws://localhost:8000{v}

Comece grátis · Sem cartão de crédito

Relacionados: Guias

Produto

Para quem é

Recursos

Recursos

Empresa

Mapa do site