什么是cookies ? python如何实现cookies信息的存和取 ,这篇文章告诉你答案。
指某些网站为了辨别用户身份而储存在用户本地终端上的一些数据,这些数据通常是经过加密的。而cookies本身属于http协议中的一个特性。而http有个特点就是无状态 , 比如 ,你要访问某宝,你的本次访问和下一次访问,对于服务器来说是它是不知道是否是同一个人。这样的话,也就没有办法实现账号登录了,因为你这一秒的登录,下一秒网站就不再认识你了。因此,必须让浏览器记住某些关键的信息,以便于你再下一次请
目录
在做接口请求时 ,我们经常会遇到这样的场景 ,就是系统的登录认证是通过cookies处理的 。
比如我要请求一个添加用户的接口 ,直接请求的话,系统认为你还没有登录 ,提示让你登录。怎么办 ?你只能先请求登录接口 ,然后从登录接口的响应中提取cookies ,然后再将cookies传递给添加用户接口 。这样添加用户接口才能正确的返回数据 。
那如果使用Python代码该如何实现呢 ? 在实现之前,你需要理解如下两点 :
-
什么是cookies ? 它是如何鉴权的 ?
-
如何使用requests进行鉴权 ?
1.cookies介绍
1.1什么是cookies
指某些网站为了辨别用户身份而储存在用户本地终端上的一些数据,这些数据通常是经过加密的 。而cookies本身属于http协议中的一个特性。
而http有个特点就是无状态 , 比如 ,你要访问某宝,你的本次访问和下一次访问,对于服务器来说是它是不知道是否是同一个人。 这样的话,也就没有办法实现账号登录了,因为你这一秒的登录,下一秒网站就不再认识你了。 因此,必须让浏览器记住某些关键的信息,以便于你再下一次请求该网站时会带上这些信息, 以保持登录状态 。而这些关键信息就是存放在本地的cookies数据 。
1.2 cookies是如何鉴权的 ?
Cookies的鉴权用户方式主要是通过在用户第一次访问服务器时,服务器会生成一个Cookies,包含用户的部分信息,如用户ID、sessionid等,然后通过响应头里的Set-Cookie传输到客户端并保存。之后,客户端在每次访问服务器时,都会在请求头里面包含这个Cookie,服务器通过比对Cookie里面的信息来确认用户的身份。为了防止Cookie被人为修改,通常会使用HMAC等加密技术进行签名。
以下是一系统的请求认证过程 :
-
第一次客户端请求 ,服务端返回了phpsessid ,客户端保存到了本地(浏览器中)
2. 第二次客户请求 ,带着刚才保存的phpsessid继续请求 。
3.进行登录成功时 ,服务端会返回登录账号和账号id ,通过cookies返回给客户端 。
4.再往后所有的客户端请求 ,都会带着这几个关键信息 ,比如:用户账号 、对应id 、phpsessid等 。服务器根据这些信息就判断出了是那个账号在登录以及是否登录 ,从而就解决了http无状态的情况 。
2.requests cookies介绍
如果你使用代码去处理cookies的信息 ,那么就的知道有这么一个三方包也可以搞定这个问题 ,它就是requests .
这就需要你掌握一些requests的一些知识 ,如有需要可参考可参考 :如果你有意学习接口自动化测试 ?这个包是你要首先掌握的。 - 知乎 (zhihu.com)
使用requests其实只需要三步就可以搞定 :
-
请求登录接口 ,获取cookies信息 ,通过响应对象,调用cookies属性 , 具体代码 :
response.cookies
-
将获取到的cookies信息转化为字典格式 ,这个需要用到
requests.utils.dict_from_cookiejar()
方法,就是将上面获取到的cookies信息传入此方法内 ,即可转化位Python字典格式 。 -
将Python字段再转化为cookies对象 ,转化后的对象即可传入对应的请求方法中了 。具体转化代码 :
requests.utils.cookiejar_from_dict(cookies, cookiejar=None, overwrite=True)
具体代码 :
import requests
import requests.utils
from cacheout import Cache
cache = Cache()
# 调用登录接口
def login():
url = "http://127.0.0.1:81/zentao/user-login.html"
body = {"account":"admin","password":"123456","passwordStrength":0}
response = requests.post(url,data=body)
cookies = requests.utils.dict_from_cookiejar(response.cookies) # 转化位Python对象
cookie_jar = requests.utils.cookiejar_from_dict(cookies, cookiejar=None, overwrite=True) # 生成cookies对象
cache.set('cookie_jar',cookie_jar) # 将cookies 保存到本地缓存中。
print(response.text)
通过以上代码的实现 ,就成功将cookies信息保存到了本地缓存了 ,下次其他的任何接口请求带上这个cookeis对象就可以了 。
3.项目实现
以下使用的是一个禅道系统,我要调用它的测试用例接口 ,但是再调用前就遇到登录认证的问题了 ,而它的认证方式就是使用的cookies认证 。故我们就可以使用上面方案去解决 。
就调用该系统下的如下两个接口 。
import requests
import json
import requests.utils
from cacheout import Cache
cache = Cache()
# 调用登录接口
def login():
url = "http://127.0.0.1:81/zentao/user-login.html"
body = {"account":"admin","password":"123456","passwordStrength":0}
response = requests.post(url,data=body)
cookies = requests.utils.dict_from_cookiejar(response.cookies)
cookie_jar = requests.utils.cookiejar_from_dict(cookies, cookiejar=None, overwrite=True)
cache.set('cookie_jar',cookie_jar)
print(response.text)
class Zentao:
def __init__(self):
login()
self.client = requests.Session()
self.cooikes = cache.get('cookie_jar')
# 获取某个项目的测试用例
def get_project_cases(self,productID):
url = "http://127.0.0.1:81/zentao/testcase-browse-{}.html".format(productID)
response = requests.get(url,self.cooikes)
print(response.text)
# 为某一项目创建测试用例
def create_cases(self,productID,title,type='feature',**kwargs):
url = "http://127.0.0.1:81/zentao/testcase-create-{}-0-0.html".format(productID)
body = {'product':productID,'title':title,'type':type}
if kwargs:
body.update(**kwargs)
response = requests.post(url,data=body,cookies=self.cooikes)
return response.text
if __name__ == '__main__':
zentao = Zentao()
print(zentao.get_zentao_all_cases())
print(zentao.get_project_cases(16))
# 若不加步骤就把这个参数去掉 。
steps = {'steps[1]':'测试用例步骤1','expects[1]':'预期正常','steps[2]':'这是测试用例第二步','expects[2]':'预期也正常'}
print(zentao.create_cases(16,'这次的测试用例带有测试步骤',**steps))
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)