FastAPI结合Uvicorn启动后代码更新不生效问题求助
我正在使用FastAPI搭配Uvicorn开发接口,此前一切正常,但现在代码更新无法生效:修改已有方法、新增接口方法都不被识别。启动命令为:uvicorn API:app --reload。
例如以下新增的接口代码未被识别:
@app.get("/clientes/cumple", response_model=List[Cliente]) async def get_cliente_cumple(dia: int, mes: int): clientes = db.obtener_clientes_por_fecha_nacimiento(dia, mes) if not clientes: raise HTTPException(status_code=404, detail="Cliente no encontrado") return [Cliente(codigoclientes=c["codigoclientes"],titular=c["titular"],fnacim=c["fnacim"],dni_cif=c["dni_cif"], telf=c["telf"]) for c in clientes]
完成代码修改后重启服务,但毫无变化。执行API的终端看似识别了变更,但请求时不再显示HTTP状态码,仅显示所谓的变更信息。
可能的原因及解决办法
清理Python模块缓存
Python的__pycache__文件夹会缓存编译后的模块文件,可能导致修改后的代码无法被加载。直接删除项目目录下所有__pycache__文件夹,然后彻底关闭Uvicorn服务再重新启动。扩大热重载监听范围
Uvicorn默认只监听主模块(API.py)和直接导入的文件。如果你的变更涉及其他依赖文件(比如模型定义、数据库操作模块),需要手动指定监听范围:uvicorn API:app --reload --reload-include "*.py"该命令会监听项目中所有
.py文件的变更,确保任何代码修改都能触发重载。检查重载日志中的错误
终端显示"Detected change"不代表重载成功,可能存在语法错误或导入问题。仔细查看终端输出的日志,确认是否有报错——比如新增代码中的List、Cliente、HTTPException是否正确导入?如果存在导入失败或语法错误,重载会终止,服务仍使用旧代码运行。彻底清理旧进程
有时候重启服务后,旧的Uvicorn进程没有完全终止,新进程的请求被旧进程拦截。手动杀死所有Uvicorn相关进程:# Linux/macOS pkill -f uvicorn # Windows taskkill /F /IM uvicorn.exe之后再重新启动服务。
验证模块导入路径
如果项目结构有调整,相对导入可能导致模块加载异常。确保API.py中能正确导入Cliente模型和db模块,避免因导入路径错误导致新代码未被加载。
内容的提问来源于stack exchange,提问作者Rodkaiser

