【发布时间】:2016-07-21 10:19:41
【问题描述】:
我正在尝试使用 python 中的请求库向服务器发送 POST 调用。早些时候我能够成功发送 POST 调用,但最近,服务器不推荐使用 TLSv1.0,现在只支持 TLSv1.1 和 TLSv1.2。现在,相同的代码向我抛出“requests.exceptions.SSLError: EOF 违反协议 (_ssl.c:590)”错误。
我在 stackoverflow Python Requests requests.exceptions.SSLError: [Errno 8] _ssl.c:504: EOF occurred in violation of protocol 上找到了这个线程,它说我们需要子类化 HTTPAdapter,之后会话对象将使用 TLSv1。我相应地更改了我的代码,这是我的新代码
class MyAdapter(HTTPAdapter):
def init_poolmanager(self, connections, maxsize, block=False):
self.poolmanager = PoolManager(num_pools=connections,
maxsize=maxsize,
block=block,
ssl_version=ssl.PROTOCOL_TLSv1)
url="https://mywebsite.com/ui/"
headers={"Cookie":"some_value","X-CSRF-Token":"some value","Content-Type":"application/json"}
payload={"name":"some value","Id":"some value"}
s = requests.Session()
s.mount('https://', MyAdapter())
r=s.post(url,json=payload,headers=headers)
html=r.text
print html
但即使在使用它之后,我也会收到相同的错误“EOF 违反协议 (_ssl.c:590)”。
我的第一个问题是,我在某处读到请求默认使用 ssl。我知道我的服务器当时使用了 TLSv1.0,所以我的代码工作正常,因为 TLSv1.0 向后兼容 ssl3.0 吗?
我的第二个问题是,我上面提到的我将代码更改为 HTTPAdapter 子类的 stackoverflow 线程说这将适用于 TLSv1。但是由于 TLSv1.0 在我的服务器中已被弃用,这段代码是否仍然有效?
【问题讨论】: