Как исправить ошибку при попытке получить прямой поток данных из FastAPI с помощью websockets (неподдерживаемый запрос на обновление.)?

#python #python-3.x #websocket #fastapi

#python #python-3.x #websocket #fastapi

Вопрос:

Как я могу получить ответ для каждой итерации, например, для прямой трансляции?

Вот RestAPI main.py:

 from fastapi import FastAPI
from fastapi import Request
from fastapi import WebSocket
import asyncio

app = FastAPI()


@app.get("/ws_res")
async def websoc(websocket: WebSocket):
    await websocket.accept()
    for i in range(100000):
        i = "John"
        await asyncio.sleep(0.01)
        await websocket.send_json({"msg": i})
    await websocket.close()
  

Теперь я пытаюсь получить ответ из кода python, но получаю сообщение об ошибке, в котором говорится Unsupported upgrade request.

Вот вывод со стороны API :

 INFO:     Started server process [67680]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL C to quit)
WARNING:  Unsupported upgrade request.
  

Вот код python, который я использовал для доступа к API ( test.py ):

 import asyncio
import websockets

async def hello():
    uri = "ws://127.0.0.1:8000/ws_res"
    async with websockets.connect(uri) as websocket:
        greeting = await websocket.recv()
        print(f"< {greeting['msg']}")


asyncio.get_event_loop().run_until_complete(hello())

Traceback (most recent call last):
  File "test.py", line 12, in <module>
    asyncio.get_event_loop().run_until_complete(hello())
  File "/usr/lib/python3.8/asyncio/base_events.py", line 616, in run_until_complete
    return future.result()
  File "test.py", line 7, in hello
    async with websockets.connect(uri) as websocket:
  File "/home/test/env/lib/python3.8/site-packages/websockets/client.py", line 517, in __aenter__
    return await self
  File "/home/test/env/lib/python3.8/site-packages/websockets/client.py", line 542, in __await_impl__
    await protocol.handshake(
  File "/home/test/env/lib/python3.8/site-packages/websockets/client.py", line 296, in handshake
    raise InvalidStatusCode(status_code)
websockets.exceptions.InvalidStatusCode: server rejected WebSocket connection: HTTP 400
  

Комментарии:

1. Почему вы закрываете websocket каждый раз, когда выполняете цикл?

2. @Mause Извините, это не было в цикле for . Небольшая ошибка, когда я скопировал код здесь. Обновлено

3. Вы установили websockets пакет в виртуальной среде, которую используете для fastapi?

4. @Mause Да, я установил его в том же env

Ответ №1:

Конечные точки веб-сокета Fastapi должны определяться с помощью websocket декоратора, а не get декоратора:

 @app.websocket("/ws_res")
async def websoc(websocket: WebSocket):
    await websocket.accept()
    for i in range(100000):
        i = "John"
        await asyncio.sleep(0.01)
        await websocket.send_json({"msg": i})
    await websocket.close()
  

Смотрите Документацию для получения полной информации: https://fastapi.tiangolo.com/advanced/websockets /