• aiohttp 异步http请求10.ClientSession自定义请求Cookie 上海


    前言

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

    自定义cookie

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

    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:

    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(需靠自己的经验了)。

    zentaosid=6f8d76hvd1ugqip86ptolb0lm1
    

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

    cookies = {
            "zentaosid": "2g5co7cgos0snikh0td9s4sha0"
        }
    

    完整的代码

    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())
    

    运行结果

    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"] 获取域名
    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)
    

    运行结果

    <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参数传进去

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

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

        cookies = {
            "zentaosid": "2g5co7cgos0snikh0td9s4sha0"
        }
        session.cookie_jar.update_cookies()
    
  • 相关阅读:
    每天进步一点点之查找
    每天进步一点点之堆栈思想
    每天进步一点点之大端存储和小端存储
    每天进步一点点之线性表的考察
    每天进步一点点之出栈顺序考点
    React Native 混合开发与实现
    谈谈JavaScript异步代码优化
    谈谈前端异常捕获与上报
    vue插件编写与实战
    vue项目构建与实战
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/16197036.html
Copyright © 2020-2023  润新知