前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >aiohttp 异步http请求-10.ClientSession自定义请求Cookie

aiohttp 异步http请求-10.ClientSession自定义请求Cookie

作者头像
上海-悠悠
发布2022-04-27 11:40:29
1.7K0
发布2022-04-27 11:40:29
举报
文章被收录于专栏:从零开始学自动化测试

前言

要将自己的 cookie 发送到服务器,可以使用构造函数的cookies 参数ClientSession

自定义cookie

cookie 定义成字典键值对格式,传参到ClientSession

代码语言:javascript
复制
url = 'http://httpbin.org/cookies'
cookies = {'cookies_are': 'working'}
async with ClientSession(cookies=cookies) as session:
    async with session.get(url) as resp:
        assert await resp.json() == {
           "cookies": {"cookies_are": "working"}}

笔记

httpbin.org/cookies端点以 JSON 编码的正文返回请求 cookie。要访问会话 cookie,请参阅ClientSession.cookie_jar。

ClientSession可用于在多个请求之间共享 cookie:

代码语言:javascript
复制
async with aiohttp.ClientSession() as session:
    await session.get(
        'http://httpbin.org/cookies/set?my_cookie=my_value')
    filtered = session.cookie_jar.filter_cookies(
        'http://httpbin.org')
    assert filtered['my_cookie'].value == 'my_value'
    async with session.get('http://httpbin.org/cookies') as r:
        json_body = await r.json()
        assert json_body['cookies']['my_cookie'] == 'my_value'

使用实例

以登录禅道网站为例,当我们第一次登录了禅道网站,浏览器关闭后,重新打开首页(非登录页),不需要再走登录流程。 像这种网站会记住登陆的cookies,并且在一段时间内都会有效(具体有效时长每个网站的失效时间不一样)

如果不想登录,可以打开登录之后的任意页面,找到请求标头里面的cookies这一栏,找到跟登录相关的cookie(需靠自己的经验了)。

代码语言:javascript
复制
zentaosid=6f8d76hvd1ugqip86ptolb0lm1

把cookie 写成字典格式键值对,多个cookie也可以

代码语言:javascript
复制
cookies = {
        "zentaosid": "2g5co7cgos0snikh0td9s4sha0"
    }

完整的代码

代码语言:javascript
复制
import aiohttp
import asyncio

async def task(session):
    async with session.get(url='/zentao/my/') as resp:
        print(resp.status)
        res = await resp.text()
        print(res)

async def main():
    cookies = {
        "zentaosid": "2g5co7cgos0snikh0td9s4sha0"
    }
    base_url = "http://127.0.0.1:8000"
    async with aiohttp.ClientSession(
            base_url=base_url, cookies=cookies) as session:
        await task(session)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

运行结果

代码语言:javascript
复制
200
<!DOCTYPE html>
<html lang='zh-cn'>
<head>
  <meta charset='utf-8'>
  <meta http-equiv='X-UA-Compatible' content='IE=edge'>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <meta name="renderer" content="webkit">
  <title>我的地盘 - 禅道</title>

从运行打印结果可以看到,是登录成功的页面。

ClientSession可用于在多个请求之间共享 cookie, 这就意味着只需在ClientSession传一次cookie,就可以在session会话里面访问当前网站的多个请求了。

获取session会话cookie

使用session.cookie_jar 获取session对象的cookies

  • session.cookie_jar 返回一个可迭代对象
  • len(session.cookie_jar) 获取cookie的个数
  • cookie.key  获取cookie的key值
  • cookie.value  获取cookie的value值
  • cookie[“domain”]  获取域名
代码语言:javascript
复制
async def main():
    cookies = {
        "zentaosid": "2g5co7cgos0snikh0td9s4sha0"
    }
    base_url = "http://127.0.0.1:8000"
    async with aiohttp.ClientSession(
            base_url=base_url, cookies=cookies) as session:
        print(session.cookie_jar)
        print(len(session.cookie_jar))
        for cookie in session.cookie_jar:
            print(cookie)
            print(cookie.key)
            print(cookie.value)
            print(cookie["domain"])
        await task(session)

运行结果

代码语言:javascript
复制
<aiohttp.cookiejar.CookieJar object at 0x000001E2C0D0ED90>
1
Set-Cookie: zentaosid=2g5co7cgos0snikh0td9s4sha0; Path=/
zentaosid
2g5co7cgos0snikh0td9s4sha0

cookie_jar 里面还有几个常用的操作方法

  • filter_cookies ( request_url ) 返回 URL 可接受的 jar cookie 并在 Cookie标头中可用于发送给定 URL 的客户端请求。 参数response_url(str) – 请求 cookie 的请求 URL。
  • update_cookies ( cookies , response_url = None ) 更新服务器在标头中返回的 cookie Set-Cookie
  • clear(predicate=None) 为None,则从jar中移除所有cookie。 否则,只删除predicate(morsel)返回 True的.
  • clear_domain(domain) 从 jar 中删除属于指定域或其子域的所有 cookie。

session会话更新cookie

ClientSession可用于在多个请求之间共享 cookie,我们可以在创建session会话的时候把cookie参数传进去

代码语言:javascript
复制
    cookies = {
        "zentaosid": "2g5co7cgos0snikh0td9s4sha0"
    }
    base_url = "http://127.0.0.1:8000"
    async with aiohttp.ClientSession(
            base_url=base_url, cookies=cookies) as session:

也可以在创建完会话,在session 对象上更新

代码语言:javascript
复制
    cookies = {
        "zentaosid": "2g5co7cgos0snikh0td9s4sha0"
    }
    session.cookie_jar.update_cookies()

2022年第 1 期《Python 测试平台开发》课程

2022年第 10 期《python接口web自动化+测试开发》课程,2月13号开学

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从零开始学自动化测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 自定义cookie
  • 使用实例
  • 获取session会话cookie
  • session会话更新cookie
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档