Как заставить внешние python пакеты использовать запросы с прокси - PullRequest
0 голосов
/ 26 мая 2020

Я пишу задание по загрузке некоторых отчетов из API. Существует внешний пакет python, который делает это за меня, просто используя:

from module import Api

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

Но этот Api критичен для IP-адреса вызывающего абонента (некоторые отчеты доступны только для указанного c местоположения ), поэтому я вынужден изменить свое местоположение либо через VPN, либо через прокси-сервер socks.

Мне нужно загрузить несколько отчетов из разных мест, поэтому я решил использовать прокси.

Я уже упоминал что под капотом мой module использует requests библиотеку для извлечения данных.

Как заставить запросы lib использовать мои прокси для внешних функций?

1 Ответ

0 голосов
/ 26 мая 2020

Оказалось, что это можно довольно просто реализовать с помощью декораторов старого стиля:

# 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')

Мой сценарий - это работа баз, поэтому мне не нужны какие-то функции unpatch .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...