zoukankan      html  css  js  c++  java
  • Python之requests模块-hook

    requests提供了hook机制,让我们能够在请求得到响应之后去做一些自定义的操作,比如打印某些信息、修改响应内容等。具体用法见下面的例子:

    import requests
    
    # 钩子函数1
    def print_url(r, *args, **kwargs):
        print("raw_url "+r.url)
    # 钩子函数2
    def change_url(r, *args, **kwargs):
        r.url = 'http://change.url'
        print("changed_url "+r.url)
        return r  # 其实没有这句话,也可以修改r.url,因为r是response对象而非普通数值,但requests官方似乎误认为回调函数一定要有return才能替换传入的数据
    
    # tips: http://httpbin.org能够用于测试http请求和响应
    url = 'http://httpbin.org/cookies'
    response = requests.get(url, hooks=dict(response=[print_url, change_url]))
    print("result_url "+response.url)

    运行结果

    raw_url http://httpbin.org/cookies
    changed_url http://change.url
    result_url http://change.url

    在例子中,定义了两个钩子函数,分别用来打印response对象中的url和修改response对象中的url。通过参数hooks=dict(response=[print_url, change_url])调用,其中response是钩子的类型(目前requests v2.22.0版本仅有这一种类型)。从运行结果中,可以看出钩子函数1和钩子函数2被顺序执行了,且达到了篡改响应结果的目的。

    上述例子中,只在requests方法级别调用了一次hook,如果想要每个请求都使用hook呢?可以在requests的session对象中添加hook来让该session对象发出去的请求均带有hook(关于session的用法可移步python之requests模块-session中查看),比如:

    s = requests.Session()
    s.hooks.update({"response": [print_url, change_url]})

    参考资料

    作者:酌三巡

    感谢阅读,如需转载请注明出处!

  • 相关阅读:
    手机兼容性测试
    Monkey测试
    ADB常用指令
    ADB移动端测试
    关于虚拟网卡V1,V8的问题
    1
    排序算法
    查找算法
    二叉树的计算
    队列
  • 原文地址:https://www.cnblogs.com/zhuosanxun/p/12700191.html
Copyright © 2011-2022 走看看