FastAPI WebSocket路由在Deta Space部署后失效,本地正常
问题:FastAPI WebSocket部署到Deta Space后无法工作(本地正常)
将FastAPI项目部署到Deta Space后,WebSocket路由/ws无法正常工作,但本地环境运行完全正常。点击发送消息后,Deta Space日志显示#404 route not found,前端控制台提示连接到wss://fastapitouch-1-l4518065.deta.app/webs失败。
相关代码
后端FastAPI代码
from fastapi import FastAPI, WebSocket from fastapi.middleware.cors import CORSMiddleware from fastapi.websockets import WebSocketDisconnect app = FastAPI( title='websocket test', description="The description", version='062023.1' ) allow_all = ['*'] app.add_middleware( CORSMiddleware, allow_origins=allow_all, allow_credentials=True, allow_methods=allow_all, allow_headers=allow_all ) @app.websocket('/ws') async def websocket_echo(websocket: WebSocket): await websocket.accept() try: while True: data = await websocket.receive_text() await websocket.send_text(f'You send: {data}') except WebSocketDisconnect: print('user disconnected')
前端Vue组件代码(原代码)
// CREATE CONNECTION let socket = new WebSocket(`wss://fastapitouch-1-l4518065.deta.app/ws`) // SEND MESSAGE socket.send(this.message) // ON MESSAGE FROM SERVER LOG IT socket.onmessage = function(event) { console.log(`Message from server: ${event.data}`) }
问题分析与解决方案
核心问题点
- 前端发送时机错误:原代码直接调用
socket.send(this.message),此时WebSocket连接尚未完成建立,会导致发送失败,甚至引发异常路径解析。 - 路径拼写不一致:前端控制台错误提示连接的是
/webs,但后端路由和代码中写的是/ws,需确认前端实际运行代码是否存在拼写错误。
修正后的前端代码
// CREATE CONNECTION let socket = new WebSocket(`wss://fastapitouch-1-l4518065.deta.app/ws`) // 等待连接建立完成后再发送消息 socket.onopen = function() { socket.send(this.message) } // 接收服务器消息 socket.onmessage = function(event) { console.log(`Message from server: ${event.data}`) } // 监听连接错误,便于排查问题 socket.onerror = function(error) { console.error('WebSocket连接错误:', error) } // 监听连接关闭事件 socket.onclose = function(event) { console.log('WebSocket连接已关闭:', event) }
额外检查项
- 确认Deta Space的Micro部署配置:没有自定义路由重写规则拦截
/ws路径,Deta Space默认会转发所有请求路径到FastAPI应用,无需额外配置。 - 核对前端实际代码中的WebSocket路径:确保没有把
/ws误写为/webs,这是导致404的常见原因之一。
内容的提问来源于stack exchange,提问作者Kovalski
相关产品推荐
相关产品推荐

