本地部署FastAPI机器学习预测应用遇WinError 10061连接拒绝问题求助
问题原因
你的代码把FastAPI服务启动逻辑和API请求代码写在了同一个文件里。执行uvicorn main:app --reload时,Python会先运行整个脚本,此时FastAPI服务还没完成启动、还没开始监听8000端口,就立刻执行了requests.post请求,导致连接被拒绝。另外原代码返回的prediction是numpy数组,直接返回会触发JSON序列化失败的问题,也需要一并处理。
修复方案
方案1:拆分请求代码到独立文件
这是最清晰的做法,将服务代码和测试请求代码分开:
- 修改
main.py,只保留FastAPI服务部分:
from fastapi import FastAPI import pickle import numpy as np from typing import * app = FastAPI() def predict(data: List[float]): with open("model.pkl", "rb") as f: model = pickle.load(f) data = np.array(data).reshape(1, -1) prediction = model.predict(data) return prediction.tolist() # 将numpy数组转为列表,避免JSON序列化错误 @app.post("/predict") def predict_route(data: List[float]): prediction = predict(data) return {"prediction": prediction}
- 创建新文件
test_request.py,放入请求代码:
import requests import json f = open('test_data.json',) data = json.load(f) response = requests.post("http://localhost:8000/predict", json=data) print(response.json())
- 启动服务:
uvicorn main:app --reload
- 打开新的命令行窗口,运行请求脚本:
python test_request.py
方案2:用条件判断隔离请求代码
如果不想拆分文件,可通过if __name__ == "__main__"让请求代码仅在直接运行脚本时执行:
from fastapi import FastAPI import pickle import numpy as np from typing import * app = FastAPI() def predict(data: List[float]): with open("model.pkl", "rb") as f: model = pickle.load(f) data = np.array(data).reshape(1, -1) prediction = model.predict(data) return prediction.tolist() @app.post("/predict") def predict_route(data: List[float]): prediction = predict(data) return {"prediction": prediction} # 仅直接运行该脚本时,才执行请求逻辑 if __name__ == "__main__": import requests import json f = open('test_data.json',) data = json.load(f) response = requests.post("http://localhost:8000/predict", json=data) print(response.json())
使用方式:
- 先启动服务:
uvicorn main:app --reload
- 打开新命令行窗口,运行脚本发送请求:
python main.py
额外注意事项
- 确保
model.pkl和代码在同一目录,或提供正确的文件路径 - 确保
test_data.json内的数据格式为List[float],比如[1.2, 3.4, 5.6]
内容的提问来源于stack exchange,提问作者spoolito
相关产品推荐
相关产品推荐

