fastapi应用启动失败导致客户端请求报错“connection refused”,根本原因是请求代码与服务启动逻辑混在同一文件中,导致请求在服务器尚未就绪时即发起。本文提供正确分离服务与测试代码的方法,并给出完整可运行示例。
在使用 FastAPI 构建本地机器学习预测服务时,一个常见但易被忽视的错误是:将客户端请求代码(如 requests.post())与服务定义写在同一 Python 文件中,并直接通过 uvicorn main:app –reload 启动。这会导致程序在 Uvicorn 尚未完成服务器初始化前,就执行了 HTTP 请求,而此时 localhost:8000 尚未监听任何端口,Windows 系统因此返回 [WinError 10061] No connection could be made because the target machine actively refused it —— 即“目标机器主动拒绝连接”。
✅ 正确做法是严格分离「服务端」与「客户端」逻辑:
- 服务端文件(main.py)仅负责定义 API 和启动服务,不包含任何 requests 调用;
- 客户端请求应独立运行(如通过 Postman、curl 或单独的 test_client.py 文件)。
以下是重构后的推荐结构:
? main.py(纯服务端,无请求逻辑):