为什么Python Requests Session中设置的proxy代理参数无法跨请求生效?
核心原因
这是Requests库的代理优先级设计导致的,Requests的代理配置生效优先级从高到低为:
- 单次请求调用时显式传入的
proxies参数 - 系统环境变量/注册表中存储的
HTTP_PROXY、HTTPS_PROXY、NO_PROXY代理配置 - Session实例上配置的
proxies属性
你当前使用的Windows系统环境中大概率配置了全局代理,且该代理不可用或与你代码中配置的代理不一致。你在Session中设置的代理优先级低于系统环境变量的代理,所以请求实际使用了系统的无效代理,最终触发SSL握手超时报错。而你单次请求显式传proxies的时候,该配置优先级最高,直接覆盖了系统代理,所以可以正常请求。
解决方案
在你的Session初始化函数中新增session.trust_env = False配置,关闭Requests读取系统环境变量配置的逻辑,就可以让Session中设置的代理全局生效,修改后的代码如下:
def requests_setup(): # setup proxy proxies = {'http': f'http://someproxy:8080', 'https': f'http://someproxy:8080'} # initialize session session = requests.Session() # 关闭读取系统环境变量配置,优先使用Session内配置 session.trust_env = False # Part 1: set up proxy session.proxies.update(proxies) # Part 2: add certificate session.verify = r'SOME_CERT_BUNDLE.pem' return session
补充说明
你将HTTPS协议的代理设置为HTTP前缀是符合使用场景的,大部分企业代理都只需要走HTTP协议建立隧道,不需要单独配置HTTPS前缀的代理地址,该配置本身没有问题。
内容的提问来源于stack exchange,提问作者Eamon Suen
相关产品推荐
相关产品推荐

