在自动化用例过程中,我们可能会涉及到一些http请求相关的内容。普通的请求通过requests常规的get/post/delete/put等方法,都可以比较轻松的完成。但是对于一些请求状态保持的情况,例如用户登录等,便需要涉及cookie和session机制,这个同样在requests里面有提供相应的方法。
- cookie请求的保持
s = requests.Session() s.get('https://httpbin.org/cookies/set/sessioncookie/123456789') r = s.get('https://httpbin.org/cookies') print(r.text) # '{"cookies": {"sessioncookie": "123456789"}}'
- 提供自定义的默认参数
s = requests.Session() s.auth = ('user', 'pass') s.headers.update({'x-test': 'true'}) # both 'x-test' and 'x-test2' are sent s.get('https://httpbin.org/headers', headers={'x-test2': 'true'})
- 即使使用会话,方法级参数也不会在请求中持续存在。如果多次请求,则都需要携带参数:
s = requests.Session() r = s.get('https://httpbin.org/cookies', cookies={'from-my': 'browser'}) print(r.text) # '{"cookies": {"from-my": "browser"}}' r = s.get('https://httpbin.org/cookies') print(r.text) # '{"cookies": {}}'
- 请求发送前可以做一些参数的准备工作
from requests import Request, Session s = Session() req = Request('GET', url, data=data, headers=headers) prepped = s.prepare_request(req) # do something with prepped.body prepped.body = 'Seriously, send exactly these bytes.' # do something with prepped.headers prepped.headers['Keep-Dead'] = 'parrot' resp = s.send(prepped, stream=stream, verify=verify, proxies=proxies, cert=cert, timeout=timeout ) print(resp.status_code)
总的来说,和直接使用requests的区别在于,是否需要使用有状态的内容。如果每次请求的内容都是独立的,则可以直接使用requests,否则可以借助session的功能。官方文档:https://requests.readthedocs.io/en/latest/user/advanced/#session-objects