【问题标题】:How to force external python packages use requests with proxy如何强制外部python包使用代理请求
【发布时间】:2020-05-26 12:11:16
【问题描述】:

我正在编写一份从 API 下载一些报告的工作。有一个外部 python 包,只需使用即可为我做到这一点:

from module import Api

api = Api(token='token')
api.download_data(save_to='file_name.csv')

但是这个Api 对调用者的 IP 地址很重要(有些报告仅适用于特定位置),所以我不得不通过 VPN 或 socks 代理更改我的位置。

我需要从不同位置下载的报告很少,所以我决定使用代理。

我提到我的 module 在后台使用 requests 库来检索数据。

如何强制 requests lib 将我的代理用于外部功能?

【问题讨论】:

    标签: python proxy python-requests python-decorators


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-06
      • 2021-10-17
      • 2021-03-07
      • 2021-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多