会话对象
会话对象能够跨请求保持某些参数
它也会在同一个 Session 实例发出的所有请求之间保持 cookie, 期间使用 urllib3 的 connection pooling 功能
所以如果向同一主机发送多个请求, 底层的 TCP 连接将会被重用, 从而带来显著的性能提升
会话对象具有主要的 Requests API 的所有方法
包含在会话中的数据都能直接使用
跨请求保持 cookie:
- >>> import requests
- >>> s = requests.session()>>> s.get(http://httpbin.org/cookies/set/sessioncookie/123456789)
- <Response [200]>
- >>> r = s.get("http://httpbin.org/cookies")
- >>> print(r.text)
- {
- "cookies": {
- "sessioncookie": "123456789"
- }
- }
会话也可用来为请求方法提供缺省数据
这是通过为会话对象的属性提供数据来实现的:
- >>> s = requests.session()
- >>> s.headers.update({test: true})
- >>> s.headers.update({test1: false})
- >>> s.get(http://httpbin.org/headers, headers={test1: true})
- <Response [200]>
- >>> s.headers
- {User-Agent: python-requests/2.18.4, Accept-Encoding: gzip, deflate, Accept: */*, Connection: keep-alive, test: true, test1: false}
- test 和 test1 的数据都会被发送
- 任何传递给请求方法的字典都会与已设置会话层数据合并, 方法层的参数会覆盖会话的参数
- 方法级别的参数也不会被跨请求保持
- >>> s = requests.session()
- >>> r = s.get(http://httpbin.org/cookies, cookies={from-my: browser})
- >>> print(r.text)
- {
- "cookies": {
- "from-my": "browser"
- }
- }
- >>> r = s.get(http://httpbin.org/cookies)
- >>> print(r.text)
- {
- "cookies": {}
- }
- 获取的 cookie 是第一个不是第二个
- 如果要手动为会话添加 cookie, 就使用 Cookie utility 函数 来操纵 Session.cookies
- 会话还可以用作前后文管理器:
- >>> with requests.session() as s:
- ... s.get(http://httpbin.org/cookies/set/sessioncookie/123456789)
- ...
- <Response [200]>
- 这样就能确保 with 区块退出后会话能被关闭, 即使发生了异常也一样
- 如果要省略字典参数中一些会话层的键只需在方法层参数中将那个键的值设置为 None , 那个键就会被自动省略掉
- 请求与响应对象
- >>> r = requests.get(http://httpbin.org/get)
- >>> r.headers #服务器返回的响应头部信息
- {Connection: keep-alive, Server: meinheld/0.6.1, Date: Fri, 09 Feb 2018 13:09:33 GMT, Content-Type: application/json, Access-Control-Allow-Origin: *, Access-Control-Allow-Credentials: true, X-Powered-By: Flask, X-Processed-Time: 0.000726938247681, Content-Length: 265, Via: 1.1 vegur}
- >>> r.request.headers #发送到服务器的请求的头部信息
- {User-Agent: python-requests/2.18.4, Accept-Encoding: gzip, deflate, Accept: */*, Connection: keep-alive}
SSL 证书验证
SSL 验证默认是开启的, 如果证书验证失败, requests 会抛出 SSLError 的错误
可以通过 verify 参数来解决
给 verify 传入 CA_BUNDLE 文件的路径, 或者包含可信任 CA 证书文件的文件夹路径
>>> requests.get(https://httpbin.org/get, verify=/path/to/certfile)
也可以把证书包含在会话中
- s = requests.session()
- s.verify = /path/to/certfile
如果 verify 设为文件夹路径, 文件夹必须通过 OpenSSL 提供的 c_rehash 工具处理
还可以通过 REQUESTS_CA_BUNDLE 环境变量定义可信任 CA 列表
verify 参数仅用于主机证书, 对于私有证书, 可以传递一个 CA_BUNDLE 文件的路径给 verify, 也可以设置 REQUEST_CA_BUNDLE 环境变量
verify 的默认值为 True, 也可以将 verify 设置为 False,requests 就会忽略对 SSL 证书的验证
- >>> requests.get(https: //www.baidu.com/, verify=False)
- < Response[200] >
来源: http://www.bubuko.com/infodetail-2493471.html