51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 268|回复: 0
打印 上一主题 下一主题

[python] Python Requests模块session的那些事

[复制链接]
  • TA的每日心情
    无聊
    前天 09:06
  • 签到天数: 941 天

    连续签到: 3 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2023-3-29 11:22:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本篇主要讲解Python Requests模块session的使用建议及整个会话中的所有cookie的方法。
      测试代码
      服务端:下面是用flask做的一个服务端,用来设置cookie以及打印请求时的请求头。
    # -*- coding: utf-8 -*-
    from flask import Flask, make_response, request

    app = Flask(__name__)


    @app.route('/a1')
    def a1():
        print(request.headers)
        rp = make_response()
        rp.set_cookie('a1', '123')
        return rp


    @app.route('/a2')
    def a2():
        print(request.headers)
        rp = make_response()
        # rp.set_cookie('a2', '234')
        return rp


    @app.route('/a3')
    def a3():
        print(request.headers)
        rp = make_response()
        rp.set_cookie('a3', '345')
        return rp


    if __name__ == '__main__':
        app.run(host='0.0.0.0')


      客户端:
    # -*- coding: utf-8 -*-

    import requests

    url1 = 'http://192.168.2.159:5000/a1'
    url2 = 'http://192.168.2.159:5000/a2'
    url3 = 'http://192.168.2.159:5000/a3'

    cookies = requests.utils.cookiejar_from_dict({'test': 'test'})
    print(type(cookies), cookies)  # RequestsCookieJar 对象
    s = requests.session()
    s.cookies = cookies    # 这里设置的cookie test=test 是所有请求中都会附带的
    s.headers = {'h1':'h1'} #  这里设置的请求头h1=h1是所有请求中都会附带的
    r1 = s.get(url1, cookies={'r1': 'r1'},headers={'h2':'h2'})  # 临时加上cookie r1=r1 和 header h2=h2 下一个请求中不会有此 cookie  和header
    r2 = s.get(url2)
    requests.utils.add_dict_to_cookiejar(s.cookies, {'xx': 'xx'})  # 在接下来的请求中,永久添加xx cookie

    r3 = s.get(url3)

    # r1.cookies 是一个RequestsCookieJar对象,可以使用  requests.utils.dict_from_cookiejar(r1.cookies) 将其转换成dict
    # 我发现可以直接用dict进行转换,这样写起来更方便  
    print(dict(r1.cookies))  # 打印r1请求的返回结果中设置的cookies
    print(dict(r2.cookies))  # 打印r2请求的返回结果中设置的cookies
    print(dict(r3.cookies))  # 打印r3请求的返回结果中设置的cookies

    print(dict(s.cookies))  # s.cookies中包含整个会话请求中的所有cookie(临时添加的如上面的r1不包含在内)


      先启动服务端,再启动客户端。
      运行结果
      服务端打印结果:
    192.168.2.159 - - [26/Jun/2019 17:28:00] "GET /a1 HTTP/1.1" 200 -
    Host: 192.168.2.159:5000
    Accept-Encoding: identity
    H1: h1
    H2: h2
    Cookie: test=test; r1=r1


    192.168.2.159 - - [26/Jun/2019 17:28:00] "GET /a2 HTTP/1.1" 200 -
    Host: 192.168.2.159:5000
    Accept-Encoding: identity
    H1: h1
    Cookie: test=test; a1=123


    192.168.2.159 - - [26/Jun/2019 17:28:00] "GET /a3 HTTP/1.1" 200 -
    Host: 192.168.2.159:5000
    Accept-Encoding: identity
    H1: h1
    Cookie: test=test; xx=xx; a1=123


      客户端打印结果:
    <class 'requests.cookies.RequestsCookieJar'> <RequestsCookieJar[<Cookie test=test for />]>
    {'a1': '123'}
    {}
    {'a3': '345'}
    {'test': 'test', 'xx': 'xx', 'a1': '123', 'a3': '345'}


      总结及使用建议
      通过服务端打印可以看出,如果我们不设置User-Agent, requests模块的请求头是python-requests/2.21.0,这不是正常浏览器的请求头,这也是为什么我们做爬虫时一定要修改请求头的一个原因。
      使用requests.session()可以帮助我们保存这个会话过程中的所有cookie,可以省去我们自己获取上一个请求的cookie,然后更新cookie后重新设置再进行请求这类操作。
      通过s.cookies 和s.headers设置的整个会话中都会携带的cookie和header。
      通过s.get(url1, cookies={'r1': 'r1'},headers={'h2':'h2'}) 这种形式设置的cookie和header 不会覆盖s.cookies和s.headers中设置的请求头和cookie,只是在此次请求中添加此cookie和header,下个请求中不会携带这里的r1和h2。
      requests.utils.add_dict_to_cookiejar(s.cookies, {'xx': 'xx'}) 可以给s设置固定cookie:xx ,这种设置的cookie 不是临时的,后面的请求中都会携带。
      r1.cookies 的结果是RequestsCookieJar对象,可以通过dict对其转换,得到一个dict,其内容是r1请求响应头中设置的cookie,如果当前请求没有被设置新cookie,则dict后的是一个空字典。
      s.cookies 的结果是整个会话过程(通过s发送的所有请求的过程)被设置的cookie,所有通过dict(s.cookies) 可以得到所有被设置cookie
      建议我们再使用的过程中,把公共部分提前设置好,比如headers、cookies、proxies。
      最近使用发现,如果整个过程中某些cookie被多次设置,直接使用dict强转会失败,最稳妥的办法,还是使用requests.utils.dict_from_cookiejar(s.cookies)来得到字典类型的cookies。

    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-5-2 23:05 , Processed in 0.067613 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表