微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ValueError:check_hostname 需要使用 Fiddler 4 的 server_hostname

如何解决ValueError:check_hostname 需要使用 Fiddler 4 的 server_hostname

最近发布的这个 question 有一些有用的答案,但与我的不一样。我正在从 ArcGIS Pro Notebook 运行 urllib3 1.26.4 和 Python 3.7。我还打开了 fiddler 4,因为我想在对脚本进行故障排除时跟踪网络流量。当我打开 fiddler 时,我只会收到以下错误。如果我关闭 fiddler,我会得到 <Response [200]>。是否无法在 fiddler 打开的情况下使用 requests 模块?我是 fiddler 的新手。

截断的脚本:

import requests

#url
idph_data = 'https://idph.illinois.gov/DPHPublicinformation/api/covidVaccine/getVaccineAdministrationCurrent'
#headers
headers = {'user-agent': 'Mozilla/5.0'}

response = requests.get(idph_data,headers=headers,verify=True)

错误

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
In  [35]:
Line 4:     response = requests.get(idph_data,verify=True)

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\requests\api.py,in get:
Line 76:    return request('get',url,params=params,**kwargs)

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\requests\api.py,in request:
Line 61:    return session.request(method=method,url=url,**kwargs)

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\requests\sessions.py,in request:
Line 542:   resp = self.send(prep,**send_kwargs)

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\requests\sessions.py,in send:
Line 655:   r = adapter.send(request,**kwargs)

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\requests\adapters.py,in send:
Line 449:   timeout=timeout

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\urllib3\connectionpool.py,in urlopen:
Line 696:   self._prepare_proxy(conn)

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\urllib3\connectionpool.py,in _prepare_proxy:
Line 964:   conn.connect()

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\urllib3\connection.py,in connect:
Line 359:   conn = self._connect_tls_proxy(hostname,conn)

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\urllib3\connection.py,in _connect_tls_proxy:
Line 506:   ssl_context=ssl_context,File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\urllib3\util\ssl_.py,in ssl_wrap_socket:
Line 432:   ssl_sock = _ssl_wrap_socket_impl(sock,context,tls_in_tls)

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\urllib3\util\ssl_.py,in _ssl_wrap_socket_impl:
Line 474:   return ssl_context.wrap_socket(sock)

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\ssl.py,in wrap_socket:
Line 423:   session=session

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\ssl.py,in _create:
Line 827:   raise ValueError("check_hostname requires server_hostname")

ValueError: check_hostname requires server_hostname
---------------------------------------------------------------------------

解决方法

我在当前版本的 ArcGIS Pro 提供的环境中也遇到了这个问题。根据您链接的问题中评分较低的答案,我在所需的环境中运行了 pip install urllib3==1.25.11(在我的情况下是默认环境的克隆),问题似乎已解决。

这显然是由于 ArcGIS Pro 提供的 urllib3 版本中的一项新功能所致。上面的命令降级到一个相对较新但有效的版本。这不会在较新版本的 urllib3 中得到解决,但目前有一个 pull request 待解决 Python 本身的潜在问题。

顺便说一句,虽然可以将 pip 配置为能够通过 fiddler 代理运行,但这并不容易,因此最好在运行任何 pip 命令时关闭 Fiddler。

找到相关的错误报告 here。问题似乎是 CPython / 内置 urllib 解析 Windows 系统代理设置的方式存在一个非常古老的错误,导致用于 https URL 的代理条目始终接收 HTTPS 前缀(而不是的 HTTP)。较新版本的 urllib3 实际上支持通过 HTTPS 使用代理,而以前并非如此。所以之前,urllib3 会忽略前缀,但现在,它会尝试使用 HTTPS 与 HTTP url 进行通信。

,

我已更新到最新的 requests v. 2.7.0,但我不再收到错误消息。如果这是与 v. 2.25.1 相关的特定于版本的问题,我正在使用它,我不确定。我没有发现任何证据。

在与我的 Python 可执行文件相同的目录中的 Windows 命令提示符中:

python -m pip install requests==2.7.0

现在,如果我使用 Fiddler 捕获运行我的原始脚本,我会得到 200 的 HTTP 状态并且我的脚本不再给我错误。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。