You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为FastAPI集成的socketio.ASGIApp设置自动重载?

问题描述

我开发了一个结合FastAPI与SocketIO ASGI的应用。修改代码后,FastAPI会自动重载,但SocketIO不会。请问有没有无需使用watchdog的方法,比如设置某个参数,来让SocketIO实现自动重载?

现有代码

from fastapi import FastAPI
import socketio


fastapi_app = FastAPI()

app = socketio.ASGIApp(sio, fastapi_app)


if __name__ == "__main__":
    import uvicorn

    uvicorn.run("app.main:app", host="127.0.0.1", port=8888, log_level="debug", reload=True)
解决方案
  • 确保socketio.Server实例(即代码里的sio)定义在模块顶层,不能放在if __name__ == "__main__"这类仅主进程执行的分支里。uvicorn重载时会启动新进程重新加载模块,顶层定义的sio会被重新初始化,自然就能同步重载SocketIO逻辑。
  • 如果SocketIO的业务代码分散在其他目录或文件中,需要给uvicorn的run方法加上reload_dirs参数,指定要监听的目录,确保这些文件的修改能触发重载:
    uvicorn.run("app.main:app", host="127.0.0.1", port=8888, log_level="debug", reload=True, reload_dirs=["app/"])
    

调整后的完整示例代码:

from fastapi import FastAPI
import socketio

# 模块顶层定义sio实例,重载时会重新初始化
sio = socketio.AsyncServer(async_mode="asgi", cors_allowed_origins="*")
fastapi_app = FastAPI()

app = socketio.ASGIApp(sio, fastapi_app)

# 示例SocketIO事件,修改这里的代码会触发重载
@sio.event
async def connect(sid, environ):
    print(f"Client {sid} connected")

if __name__ == "__main__":
    import uvicorn
    uvicorn.run("app.main:app", host="127.0.0.1", port=8888, log_level="debug", reload=True, reload_dirs=["app/"])

这样修改后,修改SocketIO相关代码时,uvicorn的重载机制会同步重新加载整个模块,不需要额外依赖watchdog就能实现SocketIO的自动重载。

内容的提问来源于stack exchange,提问作者Bravo2bad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 17:12:34