由于 HTTP 是无状态的协议,同一个客户端每个请求都是独立的,上一个请求的任意数据都无法传递到下一个请求。为了在不同的请求间保存一些共同的数据(比如登录状态),就会用到 cookie、 session。
在 requests 中要处理这种 cookie 和 session,需要用到 Session 对象(会话对象)。此对象会帮助我们自动保持类似 cookie 和 session。
这样不用我们专门处理 cookie 和 session。毕竟我们测试的绝大部分接口,都会依赖登录后在 cookie 和 session 中储存的登录认证信息。
通过我们的 showdoc 系统来演示一下:
- 登录 showdoc
- 查看当前用户的项目列表
from urllib import parse
from pprint import pprint # => 为了让字典打印更好看
import requests
host = 'http://127.0.0.1'
user = {
'username': 'showdoc',
'password':'123456'
}
s = requests.Session() # => 会话对象
# 登录
login_url = parse.urljoin(host, '/showdoc/server/index.php?s=/api/user/login')
lr = s.post(login_url, data=user) # => 登录后cookie和session都会被 s 对象保存
pprint(lr.json())
# 查看当前用户项目
mylist_url = parse.urljoin(host, '/showdoc/server/index.php?s=/api/item/myList')
mr = s.get(mylist_url) # => 通过 s 对象调用后续的请求
pprint(mr.json())
从上面的代码我们可以看出,先通过 Session 生成会话对象,通过会话对象调用 get 或者 post 方法完成请求。会话对象会保存这些请求之间的 cookie 和 session。
如果不信,你可以试试直接访问mylist
接口。然后再试试使用会话对象访问。
会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie, 期间使用 urllib3 的 connection pooling 功能。所以如果你向同一主机发送多个请求,底层的 TCP 连接将会被重用,从而带来显著的性能提升。
会话对象具有主要的 Requests API 的所有方法。