如何为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
相关产品推荐
相关产品推荐

