解决FastAPI本地跨应用调用时的Connection refused错误
问题分析与解决方案
1. 端口号不匹配(最直接原因)
你启动应用A时指定的端口是8081(启动命令:uvicorn A:api --reload --port 8081),但调用应用B时传入的回调URL却是http://127.0.0.1:8001/write——端口号写成了8001,和实际运行的A端口不符,直接导致连接被拒绝。
解决方法:将回调URL修改为http://127.0.0.1:8081/write,确保端口与A的启动端口完全一致。
2. 检查应用A的绑定地址
默认情况下,uvicorn会绑定127.0.0.1(仅本地回环可访问),如果是本地直接运行两个应用,这个配置没问题;但如果是在容器(如Docker)环境中运行,127.0.0.1是容器内部的回环地址,无法访问宿主机器上的应用A。
- 本地运行:确认A启动时未指定其他绑定地址(默认即可);
- 容器环境:启动A时需指定绑定
0.0.0.0(命令:uvicorn A:api --reload --port 8081 --host 0.0.0.0),同时回调URL改为宿主机器的IP(而非127.0.0.1)。
3. 为后台任务添加异常处理
当前应用B的process函数没有异常捕获逻辑,即使连接失败也无法输出明确的错误信息,不利于排查问题。建议补充异常处理:
def process(callback: str): req_body = {"name": "name", "result": "result"} try: response = requests.post(url=callback, json=req_body) response.raise_for_status() # 主动抛出HTTP状态码错误 print(f"回调成功,响应状态码:{response.status_code}") except requests.exceptions.RequestException as e: print(f"回调失败详情:{str(e)}")
4. 手动验证网络连通性
在运行应用B的终端中,执行curl命令测试能否直接访问应用A:
curl -X POST http://127.0.0.1:8081/write -H "Content-Type: application/json" -d '{"name":"test","result":"test"}'
- 如果curl命令能返回
{"status": "OK"},说明网络连通性正常,问题出在B的代码逻辑或传入的回调URL; - 如果curl命令也报错,检查应用A是否正常运行、端口是否被其他进程占用。
内容的提问来源于stack exchange,提问作者D3-one 6
相关产品推荐
相关产品推荐

