为什么Python requests库会忽略我自定义的Proxy-Authorization请求头?
问题原因
- requests 库默认会将
Proxy-Authorization这类代理专属头和普通请求头分开处理,直接放到普通headers参数中的代理头会在请求预处理阶段被内部逻辑移除,避免和官方的代理认证流程冲突。 - 你传入的
auth参数是目标站点的认证配置,和代理认证逻辑无关,所以移除该参数不会解决代理头丢失的问题。 - 若你的请求地址为HTTPS协议,你当前仅配置了
http类型的代理,未配置https代理,requests 会走系统默认代理,你的自定义代理头自然不会生效。 - 默认开启的
trust_env参数会读取系统/环境变量中的代理配置,覆盖你手动传入的代理相关设置,也会导致自定义头丢失。
解决方案
方案1:使用proxy_headers参数(requests 2.27+ 版本适用)
requests 2.27及以上版本新增了proxy_headers参数,专门用于传递代理专属头,放在该参数中的头不会被内部逻辑清理:
def http_post(self, url: str, headers: dict, data: str, auth: AuthBase): token = self._xsuaa.get_token(self._service) res = requests.post( url, headers=headers, data=data, # HTTPS请求也需要配置对应代理 proxies={'http': self._proxy, 'https': self._proxy}, auth=auth, verify=False, timeout=100, allow_redirects=True, # 代理头放在专门的参数中 proxy_headers={'Proxy-Authorization': f"Bearer {token}"} )
方案2:修改预请求对象(全版本兼容)
手动构造预请求对象,在预处理完成后手动添加代理头,绕过默认的清理逻辑:
def http_post(self, url: str, headers: dict, data: str, auth: AuthBase): token = self._xsuaa.get_token(self._service) session = requests.Session() # 禁用环境变量代理读取,避免配置被覆盖 session.trust_env = False # 构造请求对象 req = requests.Request( method='POST', url=url, headers=headers, data=data, auth=auth ) # 预编译请求 prepared_req = session.prepare_request(req) # 手动添加代理头,此时不会被清理 prepared_req.headers['Proxy-Authorization'] = f"Bearer {token}" # 发送请求 res = session.send( prepared_req, proxies={'http': self._proxy, 'https': self._proxy}, verify=False, timeout=100, allow_redirects=True )
内容的提问来源于stack exchange,提问作者buschium
相关产品推荐
相关产品推荐

