首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >预期ASGI消息'websocket.accept‘或’websocket.lose‘,但得到'http.response.start’

预期ASGI消息'websocket.accept‘或’websocket.lose‘,但得到'http.response.start’
EN

Stack Overflow用户
提问于 2021-03-02 10:39:12
回答 1查看 834关注 0票数 4

我想连接websockets,但是在启动时会出错。

uvicorn app:app --reload --ws websockets

需求

  • OS:LinuxUbuntu20.04 LTS

  • Python 3.8.6

  • Browser:Chrome 88.0.4324.182

  • fastapi==0.63.0

  • python-engineio==4.0.0

  • python-socketio==5.0.4

  • starlette==0.13.6

  • uvicorn==0.13.3

  • websockets==8.1

app.py

代码语言:javascript
复制
from typing import Optional

import socketio
from fastapi import FastAPI, Query, WebSocket


sio = socketio.AsyncServer(
    async_mode="asgi", cors_allowed_origins="*", logger=True, engineio_logger=True
)
app = FastAPI(debug=True)
app_socketio = socketio.ASGIApp(sio)
app.mount(path="/", app=app_socketio)


@app.websocket("/items/{item_id}/ws")
async def websocket_endpoint(
    websocket: WebSocket,
    item_id: str,
    q: Optional[int] = None,
):
    # pylint: disable=C0103,W0613
    await websocket.accept()
    while True:
        data: str = await websocket.receive_text()

react app

代码语言:javascript
复制
const Index: React.FC = () => {
    var ws = new WebSocket('ws://127.0.0.1:8000/items/1/ws')
}

溯源

代码语言:javascript
复制
Traceback (most recent call last):
  File "/home/m0nte-cr1st0/.virtualenvs/hypercube/lib/python3.8/site-packages/uvicorn/protocols/websockets/websockets_impl.py", line 157, in run_asgi
    result = await self.app(self.scope, self.asgi_receive, self.asgi_send)
  File "/home/m0nte-cr1st0/.virtualenvs/hypercube/lib/python3.8/site-packages/uvicorn/middleware/proxy_headers.py", line 45, in __call__
    return await self.app(scope, receive, send)
  File "/home/m0nte-cr1st0/.virtualenvs/hypercube/lib/python3.8/site-packages/fastapi/applications.py", line 199, in __call__
    await super().__call__(scope, receive, send)
  File "/home/m0nte-cr1st0/.virtualenvs/hypercube/lib/python3.8/site-packages/starlette/applications.py", line 111, in __call__
    await self.middleware_stack(scope, receive, send)
  File "/home/m0nte-cr1st0/.virtualenvs/hypercube/lib/python3.8/site-packages/starlette/middleware/errors.py", line 146, in __call__
    await self.app(scope, receive, send)
  File "/home/m0nte-cr1st0/.virtualenvs/hypercube/lib/python3.8/site-packages/starlette/exceptions.py", line 58, in __call__
    await self.app(scope, receive, send)
  File "/home/m0nte-cr1st0/.virtualenvs/hypercube/lib/python3.8/site-packages/starlette/routing.py", line 566, in __call__
    await route.handle(scope, receive, send)
  File "/home/m0nte-cr1st0/.virtualenvs/hypercube/lib/python3.8/site-packages/starlette/routing.py", line 376, in handle
    await self.app(scope, receive, send)
  File "/home/m0nte-cr1st0/.virtualenvs/hypercube/lib/python3.8/site-packages/engineio/async_drivers/asgi.py", line 65, in __call__
    await self.not_found(receive, send)
  File "/home/m0nte-cr1st0/.virtualenvs/hypercube/lib/python3.8/site-packages/engineio/async_drivers/asgi.py", line 110, in not_found
    await send({'type': 'http.response.start',
  File "/home/m0nte-cr1st0/.virtualenvs/hypercube/lib/python3.8/site-packages/uvicorn/protocols/websockets/websockets_impl.py", line 209, in asgi_send
    raise RuntimeError(msg % message_type)
RuntimeError: Expected ASGI message 'websocket.accept' or 'websocket.close', but got 'http.response.start'.
EN

回答 1

Stack Overflow用户

发布于 2022-02-07 14:10:20

代码语言:javascript
复制
const Index: React.FC = () => {
var ws = new WebSocket('ws://127.0.0.1:8000/items/1/ws')

}

使此函数异步并等待并重试。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66437750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档