Как в FastAPI создать документацию для WebSocket?

Как создать документацию для встроенных веб-сокетов в FastAPI? Имеется в виду хотя бы примерный вариант.
  • 16 января 2025 г. 13:13
Ответы на вопрос 2
FastAPI автоматически генерирует документацию для RESTful API, но поддержка WebSocket не так развита, как для обычных маршрутов. Тем не менее, вы можете предоставить информацию о ваших WebSocket-соединениях и их использовании с помощью описаний и аннотаций.

Вот пример того, как можно организовать документацию для WebSocket в FastAPI:

```python
from fastapi import FastAPI, WebSocket
from fastapi.responses import HTMLResponse
from fastapi import WebSocketDisconnect
from typing import List

app = FastAPI()

# Список для хранения активных соединений
active_connections: List[WebSocket] = []

@app.get("/")
async def get():
    return HTMLResponse(content="""
    <html>
        <head>
            <title>WebSocket Example</title>
        </head>
        <body>
            <h1>WebSocket</h1>
            <form action="" onsubmit="return sendMessage(event)">
                <input type="text" id="messageText" autocomplete="off" />
                <button>Send</button>
            </form>
            <ul id='messages'></ul>
            <script>
                var ws = new WebSocket("ws://localhost:8000/ws");
                ws.onmessage = function(event) {
                    var messages = document.getElementById('messages');
                    var message = document.createElement('li');
                    message.appendChild(document.createTextNode(event.data));
                    messages.appendChild(message);
                };
                function sendMessage(event) {
                    var input = document.getElementById("messageText");
                    ws.send(input.value);
                    input.value = '';
                    event.preventDefault();
                }
            </script>
        </body>
    </html>
    """)

@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()
    active_connections.append(websocket)
    try:
        while True:
            data = await websocket.receive_text()
            # Отправляем сообщение обратно всем активным соединениям
            for connection in active_connections:
                await connection.send_text(f"Message: {data}")
    except WebSocketDisconnect:
        active_connections.remove(websocket)

```

### Комментарии к коду:

1. **WebSocket Endpoint**: В этом примере создается WebSocket эндпоинт `"/ws"`, который принимает соединения и обрабатывает сообщения.
2. **HTML Страница**: На главной странице отображается простой HTML, который использует WebSocket для отправки и получения сообщений.
3. **Обработка сообщений**: Когда клиент отправляет сообщение, оно рассылается всем активным соединениям.

### Документация:

Для окончательной документации WebSocket-соединений вам нужно будет предоставить дополнительную информацию, например:

- Как открыть соединение.
- Формат сообщений.
- Ожидаемое поведение приложения.
- Инструкции о том, как подключаться и взаимодействовать с WebSocket.

Если хотите создать более полную документацию, можно использовать Swagger UI или Redoc (которые предоставляет FastAPI для RESTful API) и дополнить их блоками, описывающими ваши WebSocket-операции. В качестве альтернативы, вы можете использовать Markdown-файлы или другую систему документации для создания более подробного описания вашего WebSocket API.
FastAPI автоматически генерирует только OpenAPI Specification, это про HTTP API, websocket это другой уровень, так что самим FastAPI никак, гугли сторонние библиотеки или читай что пишут в гите например https://github.com/fastapi/fastapi/discussions/7713
Похожие вопросы