python - 如何强制外部python包使用代理请求
问题描述
我正在写一份从 API 下载一些报告的工作。有一个外部 python 包,只需使用它就可以为我做到这一点:
from module import Api
api = Api(token='token')
api.download_data(save_to='file_name.csv')
但这Api
对于调用方 IP 地址至关重要(某些报告仅适用于特定位置),因此我不得不通过 VPN 或 socks 代理更改我的位置。
我必须从不同位置下载的报告很少,所以我决定使用代理。
我提到在后台我module
使用requests
库来检索数据。
如何强制请求库将我的代理用于外部功能?
解决方案
事实证明,这可以通过非常简单的老式装饰器来实现:
# 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')
我的 scipt 是工作基础,所以我不需要那种unpatch功能。
推荐阅读
- c# - (验证)在 MVC Post 中在一分钟内仅发布一条记录
- linux - 如何使用 exec 和 du 命令找出文件的大小
- java - 如何忽略 JSON 属性的底层结构并将其存储为字符串?
- python - 将 datetime 对象与 Panda 系列元素进行比较
- python - Python 连接到 Microsoft 分析服务
- postgresql - 如何在字段行之间返回具有不同值的 ID
- javascript - 音量进度条,OffsetX 未定义
- c++ - “获取”其他获取函数的获取函数
- javascript - 有没有办法访问 marko 类中的“窗口”和“文档”引用?
- arrays - 带有数组的Angular 7 mat-table