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]})
參考資料
- https://requests.readthedocs.io/en/master/user/advanced/#event-hooks
- https://github.com/psf/requests/blob/master/requests/hooks.py