我的 python 版本是 3.11.1, 用 requests 或者 httpx 做 http 请求时经常遇到 ssl 错误,忽略证书验证就会提示一大串警告,或者就是直接超时,正常时不可能超时的,不知道这个时间消耗在了哪里,不知道是不是还是 ssl 的问题,搞不懂 python 的 ssl 到底要怎么搞
不知道是个例还是大家都一样、还是需要配置哪里我没搞对
同样的地址和请求方式我用 GO 从来没遇到过超时和稀奇古怪的问题,没一点毛病
有时候临时写个小脚本想用 python 快速写一下,用完就删了,就会出现上面的毛病,本来很简单的事要搞好久,有时候还是用 GO 再重写一遍。。。
1
forQ 2023-09-28 14:04:00 +08:00
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning) 这个? |
3
zzl22100048 2023-09-28 14:16:54 +08:00
具体是访问那个网址? 3.11 默认配置对证书更严格,你可以自定义 sslcontext ,或者不校验证书
|
4
lambdaq 2023-09-28 14:20:12 +08:00
https://www.python-httpx.org/advanced/#changing-the-verification-defaults
r = httpx.get("https://example.org", verify=False) |
5
AlanStar 2023-09-28 14:25:13 +08:00
OP 这个问题有这么几个可能。
1.开了代理,CFW 之类的,我的 py 运行的时候有时候会受代理的影响,如果你需要让 py 的请求过代理,可以这么写。 以 requests 为例:my_proxy = {‘https’: '127.0.0.1:7890'} requests.get(url, proxies=my_proxy)。其中那个 dict 的地址按照自己实际情况来写。 2.缺少 urllib3 这个库,你可以用 pip 安装一下,我是在部署云函数(3.10)的时候发现了类似的问题,安装了之后就不会报错了 如果可以的话放一下代码和报错信息 |
6
hackpro 2023-09-28 14:31:44 +08:00 via iPhone
我也是经常碰到这个 恶心的不行🤢
特意安装了 GUI 版本的 运行 Install Certificates.command 也不行 有些是直接安装 prebuilt binary ,比如 yt-dlp 一堆 ssl error |
7
jianyang OP @zzl22100048
没有特定的地址,感觉好多都会🙁 @lambdaq 一半都是 verify=False 总不能为了发个 HTTP 请求还去倒个证书用吧 @AlanStar 是开了代理、我 Surge 常挂,不过我用 pycharm 启动的是走不了代理的,urllib3 这个库也装了,好像装 requests 的时候就会一起装上 奇怪的问题主要是 SSL 偶尔会直接报错,确定设置了 verify=False 再就是莫名其妙的超时,我也说不清是不是超时,我感觉像,但是 err 信息是空白,正常来讲访问的地址是不可能超时的 |
9
jianyang OP @lambdaq 我一般设置 timeout=(10,10)
请求的时候有时候感觉也确实等了有 10 秒左右,就 err 了,但是 err 信息是"" 但是请求的地址正常是不可能耗时 10 秒不返回的,正常 1-2S 就返回了 |
11
jianyang OP @lambdaq
如果是 DNS 挂了那为啥当时我马上用 GO 重写一遍就没一点问题,好几次了都是 python 写完再用 GO 重写一遍。。。 |
12
AlanStar 2023-09-28 15:48:13 +08:00
@jianyang “urllib3 这个库也装了,好像装 requests 的时候就会一起装上”这个确实,但是最好手动装一下确认一下,我云函数那个 case 就是,在本地确认有这个库存在,但是一传到云端就出问题,重新装一下就好了。
我记得好像 pycharm 是调的 powershell ,好像是默认走代理的吧,Surge 我没用过,具体看 OP 自己的情况了 |
14
Outclass 2023-09-28 18:47:35 +08:00
我认为就是代理的问题,见知乎文章 https://zhuanlan.zhihu.com/p/350015032
可以在 requests 请求中添加代理参数 requests.get(url, proxies=my_proxy) 我一般会直接在代码开头设置环境变量也能解决 os.environ['http_proxy'] = 'http://127.0.0.1:7890' os.environ['https_proxy'] = 'http://127.0.0.1:7890' 一般情况下,我是在系统变量中直接添加代理环境变量 HTTP_PROXY=http://127.0.0.1:7890 ,HTTPS_PROXY=http://127.0.0.1:7890 ,不过这就需要代理软件一直打开了 此外,由于代理这个问题也可能导致 pip 下载失败(用到 urilib3 库),反正就很搞 |
15
Vegetable 2023-09-28 19:25:17 +08:00
这 9 成是代理问题,下次遇到你可以试试禁用代理的方案,或者先关掉所有网络科技。
|
16
sky96111 2023-09-28 20:01:06 +08:00 via Android
有同样的疑惑,出现在 Python 编写的包管理器 dnf 上,切换代理经常导致整个 dnf 程序没有一点输出 hang 住 40 多秒
|
17
sky96111 2023-09-28 20:03:03 +08:00 via Android
@sky96111 (注:不是指在程序运行时切换代理,是程序 hang 住这个时间段曾经有切换代理的操作
|
18
maocat 2023-09-29 00:35:05 +08:00
#15 可能是 pycharm 代理问题,我用 langchain 请求 chatgpt api ,明明没有配置代理,却能通(本机开了代理),可以试试打包到服务器上看看
|
23
sky96111 2023-09-29 13:44:12 +08:00 via Android
@julyclyde 还没正式发布的 dnf5 才是 c++,yum 是 dnf 的 alias ,都是 python
|
24
julyclyde 2023-09-29 13:59:12 +08:00
@sky96111 我觉得你可能混淆了 yum3 和 yum4/dnf
yum3 是 python 的; yum4 是指向 C++的 dnf 的 alias |
25
stonesirsir 2023-09-29 14:06:00 +08:00 via Android
有 ipv6 吗?强制 ipv4 ?
|
26
julyclyde 2023-09-29 14:10:46 +08:00
@sky96111 我查了一下资料,发现你说的情况以前确实是存在过的
所以我觉得提到 yum 、dnf 的时候确实有必要说一下版本 根据维基百科: DNF was originally written in Python, but as of 2016 efforts were under way to port it to C and move most functionality from Python code into the new libdnf library.[12] In 2018, the DNF team announced the decision to move libdnf from C to C++. 在 RHEL8 之后,yum4 是 C++的 dnf 的别名;在 RHEL7 时代,yum 是一个纯 python 的东西,那时代 dnf 没有被引入 RHEL 应该是没有用过 python 版本的 dnf 吧? |
27
sky96111 2023-09-29 18:24:05 +08:00 via Android
@julyclyde 又查了一下,dnf 是纯 Python 的,但 dnf 底层使用的 libdnf 是 c++。
看起来我 dnf 卡住的问题和 Python http 请求的问题不是同一个 |
28
pursuer 2023-09-30 11:02:42 +08:00
python 可以使用 faulthandler 排查问题
|