#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 /