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]})

 

參考資料

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM