You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

urllib3.exceptions.NewConnectionError排查:调用get_data方法时连接失败

分析与修复:urllib3.exceptions.NewConnectionError 问题

咱们先把问题拆解开:你遇到的这个连接错误,本质是代码尝试发起HTTP请求,但完全无法连接到目标服务器。从你的日志能打印111和222来看,问题肯定出在调用UserInfoUtil.get_info(id,uid)之后,具体是在get_info方法里的results = id.get_info(date_type).query(params)这一步——这行代码背后应该是在调用某个需要网络连接的服务(比如Elasticsearch、后端API或者其他远程服务),但连接建立失败了。

可能的错误原因

1. 目标服务未启动或地址配置错误

这是最常见的原因:

  • 你要连接的服务(比如ES、业务API)根本没运行,或者启动失败了;
  • 代码里配置的服务地址/端口写错了——比如服务在本地127.0.0.1:9200,但代码里硬编码成了远程服务器地址,或者端口号输错了。

2. 网络或防火墙限制

  • 如果目标服务在远程机器,你的本地机器可能被对方防火墙拦截,无法访问目标端口;
  • 如果是本地服务,可能服务绑定的是127.0.0.1(仅本地可访问),但代码里用了机器的公网IP/局域网IP,导致连接失败;
  • 代理配置问题:如果你的环境需要代理才能访问外部服务,但代码里没配置代理参数,也会触发这个错误。

3. 代码里的隐性语法/变量问题

看你粘贴的get_info方法代码,有几个明显的疏漏(可能是粘贴时遗漏,但也可能导致运行异常):

  • params变量未定义:query(params)里的params没有初始化,这会先触发NameError,不过你说走到了get_info,可能是粘贴时漏了;
  • places变量未初始化:直接调用places.append(...)但没提前声明places = [];
  • if data and idx < 2 continue语法错误,缺少冒号,且data变量未定义;
    这些基础错误可能干扰代码正常执行,得先修正。

修复步骤

第一步:先排查目标服务的可达性

  1. 手动测试连接:用curl http://<服务地址>:<端口>或者浏览器访问,确认服务是否正常响应;
  2. 核对代码里的服务配置:找到id.get_info(date_type)背后的客户端(比如ES客户端、HTTP请求客户端),检查它的地址、端口配置是否和实际服务一致。

第二步:修正代码里的基础错误

先把get_info方法里的明显问题改掉:

@classmethod
def get_info(cls, id, uid, ignore_home_work=True, ratio_class=1, date_type="everyday"):
    # 补充定义params变量(根据你的业务逻辑填充实际参数)
    params = {"uid": uid, "date_type": date_type}
    results = id.get_info(date_type).query(params)
    places = []  # 初始化返回列表
    data = False  # 根据业务需求赋值,这里先默认False
    if len(results) == 0:
        return []
    for idx, place in enumerate(results):
        if data and idx < 2:  # 修复语法错误,添加冒号
            continue
        if place['rate'] <= ratio_class:
            # 用cls代替硬编码的类名,避免类名写错
            places.append(cls.createUserHighRatioStayPlace(id, place['uid'], place))
    return places

第三步:调试HTTP请求细节

如果服务是正常运行的,那可以在代码里加日志,确认实际请求的地址:

# 在发起请求前打印客户端的配置信息
client = id.get_info(date_type)
# 根据实际客户端的属性调整,比如ES客户端是client.url,HTTP客户端是client.base_url
print(f"当前尝试连接的服务地址:{client.url}")
results = client.query(params)

这样能快速确认代码是不是在连接错误的地址。

第四步:确认超时与重试配置

虽然你说设置了超时1000,但要确保配置真的生效了:

  • 如果用的是requests库,要在客户端初始化时设置超时,比如requests.get(url, timeout=1000);
  • 可以添加重试机制,应对偶发的网络波动:
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

# 给requests会话添加重试逻辑
session = requests.Session()
retry_strategy = Retry(
    total=3,
    backoff_factor=1,
    status_forcelist=[429, 500, 502, 503, 504]
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session.mount("http://", adapter)
session.mount("https://", adapter)

如果是自定义客户端,也要确保它的超时、重试参数配置正确。

总结

优先排查服务是否运行、地址是否正确、网络是否连通这三个核心点,这是这类连接错误的最常见根源。然后修正代码里的基础语法问题,最后通过调试日志确认请求细节。

内容的提问来源于stack exchange,提问作者user9207534

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:41:40