当前位置:   article > 正文

什么是cookies ? python如何实现cookies信息的存和取 ,这篇文章告诉你答案。_python将cookies保存

python将cookies保存

目录

1.cookies介绍

1.1什么是cookies

1.2 cookies是如何鉴权的 ?

2.requests cookies介绍

3.项目实现


在做接口请求时 ,我们经常会遇到这样的场景 ,就是系统的登录认证是通过cookies处理的 。

比如我要请求一个添加用户的接口 ,直接请求的话,系统认为你还没有登录 ,提示让你登录。怎么办 ?你只能先请求登录接口 ,然后从登录接口的响应中提取cookies ,然后再将cookies传递给添加用户接口 。这样添加用户接口才能正确的返回数据 。

那如果使用Python代码该如何实现呢 ? 在实现之前,你需要理解如下两点 :

  1. 什么是cookies ? 它是如何鉴权的 ?

  2. 如何使用requests进行鉴权 ?

1.cookies介绍

1.1什么是cookies

指某些网站为了辨别用户身份而储存在用户本地终端上的一些数据,这些数据通常是经过加密的 。而cookies本身属于http协议中的一个特性。

而http有个特点就是无状态 , 比如 ,你要访问某宝,你的本次访问和下一次访问,对于服务器来说是它是不知道是否是同一个人。 这样的话,也就没有办法实现账号登录了,因为你这一秒的登录,下一秒网站就不再认识你了。 因此,必须让浏览器记住某些关键的信息,以便于你再下一次请求该网站时会带上这些信息, 以保持登录状态 。而这些关键信息就是存放在本地的cookies数据 。

1.2 cookies是如何鉴权的 ?

Cookies的鉴权用户方式主要是通过在用户第一次访问服务器时,服务器会生成一个Cookies,包含用户的部分信息,如用户ID、sessionid等,然后通过响应头里的Set-Cookie传输到客户端并保存。之后,客户端在每次访问服务器时,都会在请求头里面包含这个Cookie,服务器通过比对Cookie里面的信息来确认用户的身份。为了防止Cookie被人为修改,通常会使用HMAC等加密技术进行签名。

以下是一系统的请求认证过程 :

  1. 第一次客户端请求 ,服务端返回了phpsessid ,客户端保存到了本地(浏览器中)

2. 第二次客户请求 ,带着刚才保存的phpsessid继续请求 。  

3.进行登录成功时 ,服务端会返回登录账号和账号id ,通过cookies返回给客户端 。  

4.再往后所有的客户端请求 ,都会带着这几个关键信息 ,比如:用户账号 、对应id 、phpsessid等 。服务器根据这些信息就判断出了是那个账号在登录以及是否登录 ,从而就解决了http无状态的情况 。

 

2.requests cookies介绍

如果你使用代码去处理cookies的信息 ,那么就的知道有这么一个三方包也可以搞定这个问题 ,它就是requests .

这就需要你掌握一些requests的一些知识 ,如有需要可参考可参考 :如果你有意学习接口自动化测试 ?这个包是你要首先掌握的。 - 知乎 (zhihu.com)

使用requests其实只需要三步就可以搞定 :

  1. 请求登录接口 ,获取cookies信息 ,通过响应对象,调用cookies属性 , 具体代码 :response.cookies

  2. 将获取到的cookies信息转化为字典格式 ,这个需要用到requests.utils.dict_from_cookiejar() 方法,就是将上面获取到的cookies信息传入此方法内 ,即可转化位Python字典格式 。

  3. 将Python字段再转化为cookies对象 ,转化后的对象即可传入对应的请求方法中了 。具体转化代码 :requests.utils.cookiejar_from_dict(cookies, cookiejar=None, overwrite=True)

具体代码 :

  1. import requests
  2. import requests.utils
  3. from cacheout import Cache
  4. cache = Cache()
  5. # 调用登录接口
  6. def login():
  7. url = "http://127.0.0.1:81/zentao/user-login.html"
  8. body = {"account":"admin","password":"123456","passwordStrength":0}
  9. response = requests.post(url,data=body)
  10. cookies = requests.utils.dict_from_cookiejar(response.cookies) # 转化位Python对象
  11. cookie_jar = requests.utils.cookiejar_from_dict(cookies, cookiejar=None, overwrite=True) # 生成cookies对象
  12. cache.set('cookie_jar',cookie_jar) # 将cookies 保存到本地缓存中。
  13. print(response.text)

通过以上代码的实现 ,就成功将cookies信息保存到了本地缓存了 ,下次其他的任何接口请求带上这个cookeis对象就可以了 。

3.项目实现

以下使用的是一个禅道系统,我要调用它的测试用例接口 ,但是再调用前就遇到登录认证的问题了 ,而它的认证方式就是使用的cookies认证 。故我们就可以使用上面方案去解决 。

就调用该系统下的如下两个接口 。

 

 

  1. import requests
  2. import json
  3. import requests.utils
  4. from cacheout import Cache
  5. cache = Cache()
  6. # 调用登录接口
  7. def login():
  8. url = "http://127.0.0.1:81/zentao/user-login.html"
  9. body = {"account":"admin","password":"123456","passwordStrength":0}
  10. response = requests.post(url,data=body)
  11. cookies = requests.utils.dict_from_cookiejar(response.cookies)
  12. cookie_jar = requests.utils.cookiejar_from_dict(cookies, cookiejar=None, overwrite=True)
  13. cache.set('cookie_jar',cookie_jar)
  14. print(response.text)
  15. class Zentao:
  16. def __init__(self):
  17. login()
  18. self.client = requests.Session()
  19. self.cooikes = cache.get('cookie_jar')
  20. # 获取某个项目的测试用例
  21. def get_project_cases(self,productID):
  22. url = "http://127.0.0.1:81/zentao/testcase-browse-{}.html".format(productID)
  23. response = requests.get(url,self.cooikes)
  24. print(response.text)
  25. # 为某一项目创建测试用例
  26. def create_cases(self,productID,title,type='feature',**kwargs):
  27. url = "http://127.0.0.1:81/zentao/testcase-create-{}-0-0.html".format(productID)
  28. body = {'product':productID,'title':title,'type':type}
  29. if kwargs:
  30. body.update(**kwargs)
  31. response = requests.post(url,data=body,cookies=self.cooikes)
  32. return response.text
  33. if __name__ == '__main__':
  34. zentao = Zentao()
  35. print(zentao.get_zentao_all_cases())
  36. print(zentao.get_project_cases(16))
  37. # 若不加步骤就把这个参数去掉 。
  38. steps = {'steps[1]':'测试用例步骤1','expects[1]':'预期正常','steps[2]':'这是测试用例第二步','expects[2]':'预期也正常'}
  39. print(zentao.create_cases(16,'这次的测试用例带有测试步骤',**steps))

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/608223
推荐阅读
相关标签
  

闽ICP备14008679号