首页 > 解决方案 > 如何强制外部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库来检索数据。

如何强制请求库将我的代理用于外部功能?

标签: pythonproxypython-requestspython-decorators

解决方案


事实证明,这可以通过非常简单的老式装饰器来实现:

# 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功能。


推荐阅读