我正在写一份工作,以从API下载一些报告。有一个外部python包,只需使用即可为我完成此操作:
from module import Api
api = Api(token='token')
api.download_data(save_to='file_name.csv')
但是此Api
对于呼叫者IP地址至关重要(某些报告仅适用于特定位置),因此我被迫通过VPN或袜子代理更改位置。
我几乎不必从其他位置下载报告,因此我决定使用代理。
我提到我的module
在后台使用requests
库来检索数据。
如何强制请求库将代理用于外部功能?
答案 0 :(得分:0)
原来,这可以通过非常简单的老式装饰器来实现:
# config.py
HTTP_METHODS = ['get', 'post', 'put', 'delete', 'head', 'patch', 'options']
# helper.py
import requests
from config import HTTP_METHODS
def _add_proxy(http_req, country):
# retrieve proxy settings for the country
proxy = get_proxy(country)
def wrapper(*args, **kwargs):
kwargs['proxies'] = proxy
return http_req(*args, **kwargs)
return wrapper
def patch_requests_with_proxy(country):
for m in HTTP_METHODS:
setattr(requests, m, _add_proxy(getattr(requests, m), country))
我的新脚本的用法将是:
from module import Api
from helper import patch_requests_with_proxy
api = Api(token='token')
patch_requests_with_proxy('ContryName1')
api.download_data(save_to='file_name1.csv')
patch_requests_with_proxy('ContryName2')
api.download_data(save_to='file_name2.csv')
我的工作是工作基础,所以我不需要取消补丁功能。