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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:26:06