MacOS下Django2.1+Python3.7调用BioPython时SSL证书验证失败
嘿,这个问题我太熟悉了——Mac上的Python 3.7经常会碰到SSL证书验证的坑,尤其是用BioPython调用NCBI的Entrez接口的时候。你已经装了certifi但没用,大概率是Python没正确关联到certifi的证书,或者系统层面的证书配置没跟上。给你几个靠谱的解决办法,按顺序试:
解决Mac上Python 3.7 + BioPython SSL证书验证失败的问题
1. 运行Python自带的证书安装脚本(最推荐的官方解法)
Mac上从python.org下载的Python 3.7默认没有预装系统根证书,官方专门提供了一个脚本一键修复:
打开终端,执行这条命令:
/Applications/Python\ 3.7/Install\ Certificates.command
这个脚本会自动把certifi维护的根证书安装到Python的信任库中,90%的情况跑完这个就解决问题了。
2. 在代码里手动指定certifi的证书
如果上面的方法没生效,可以直接在你的视图函数里配置SSL上下文,强制Entrez使用certifi的证书:
修改你的代码,添加证书配置部分:
from Bio import Entrez import certifi import ssl def results(request): disease = request.GET.get('disease_name') year_beginning = request.GET.get('year_beginning') year_ending = request.GET.get('year_ending') # 配置SSL上下文使用certifi的证书 ctx = ssl.create_default_context(cafile=certifi.where()) Entrez._default_context = ctx Entrez.email = "test@gmail.com" handle = Entrez.esearch( db="pubmed", sort="relevance", term=disease, mindate=year_beginning, maxdate=year_ending, retmode="xml", ) results = Entrez.read(handle, validate="False") handle.close() print(results) context = { 'results': results, } return render(request, 'lm_test/results.html', context)
这样就能让Entrez调用NCBI接口时,用certifi提供的可信根证书完成验证。
3. 临时绕过证书验证(仅测试用,生产环境绝对别用)
如果你只是想快速确认是不是证书的问题,可以临时关闭证书验证,但这会带来安全风险,只能用来排查问题:
import ssl from Bio import Entrez # 临时禁用SSL证书验证(仅测试!) ssl._create_default_https_context = ssl._create_unverified_context def results(request): # 你的原有代码...
额外检查项
- 先确保certifi是最新版本:在终端运行
pip install --upgrade certifi更新一下。 - 如果你的网络用了代理,代理的证书可能会干扰验证,需要把代理的证书加入系统或Python的信任库。
内容的提问来源于stack exchange,提问作者ChrisB
相关产品推荐
相关产品推荐

