PyScript调用requests请求GitHub报SSL模块不可用如何解决
问题根因
浏览器端运行的PyScript本质是基于WASM编译的Pyodide运行时,和你本地安装的原生CPython环境有本质区别:
- Pyodide的WASM运行时没有编译原生SSL模块,urllib3、requests这类依赖原生socket、原生SSL栈的库无法在这个环境下正常发起HTTPS请求
- 你本地设置
verify=False能生效,是因为本地原生Python有完整的SSL实现,只是关闭了证书校验逻辑;但浏览器环境下根本没有这套原生网络栈,这个参数完全不生效,和你试了多少本地环境的SSL修复方案都没关系。
修复方法
把所有requests发起的网络请求,全部替换为Pyodide官方提供的pyodide.http.open_url方法,这个方法底层走浏览器原生Fetch API,HTTPS证书校验由浏览器底层自动处理,不需要手动配置SSL相关参数,也不会报SSL模块缺失的错误。
具体修改点:
- 删除代码中
import requests的导入语句,以及代码里没有实际用到的glob、os、sys冗余导入 - 用
open_url替代requests.get拉取GitHub页面内容 - 读取CSV文件时,同样用
open_url包装raw格式的文件地址,再传给pandas读取,避免pandas默认调用urllib3触发SSL错误
修正后的完整可运行代码如下:
<py-env> - matplotlib - pandas - seaborn - lxml </py-env> <py-script> import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from js import document from pyodide import create_proxy from pyodide.http import open_url from lxml import html # 拉取数据逻辑 def selectChange(event): # 用open_url替代requests.get拉取页面 page_content = open_url('https://github.com/Nitink2001/EnergyUpgraded.git').read() webpage = html.fromstring(page_content) path = webpage.xpath('//a/@href') li = [] for p in path: if p.endswith('.csv'): url = 'https://github.com'+p.replace('/blob/', '/raw/') # 读CSV同样用open_url包装地址 df = pd.read_csv(open_url(url)) li.append(df.T) frame = pd.concat(li) frame.dropna(inplace=True) print(frame.head()) choice = document.getElementById("hdem").value print(choice) def setup(): change_proxy = create_proxy(selectChange) e = document.getElementById("hdem") e.addEventListener("change", change_proxy) setup() </py-script>
注意事项
- 不要尝试在Pyodide环境中重装ssl、requests、urllib3类的包修复问题,这个错误是WASM运行时的架构限制导致的,不是缺包或者配置错参数,所有本地Python环境的SSL修复方案在这个场景下都无效
- 不需要设置任何
verify=False类的参数,浏览器会自动处理HTTPS连接的证书校验,只要目标地址的证书本身是浏览器信任的,就能正常拉取数据
内容的提问来源于stack exchange,提问作者Nitin Kumar
相关产品推荐
相关产品推荐

