Декорирование запросов в модуле с помощью вызовов до и после метода - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть класс с именем Client, который использует модуль requests для взаимодействия со службой. У него есть такие методы, как:

def get_resource(self, url, headers):
    response = requests.get(url, headers, auth=self.auth)
    return response

Теперь я хочу вызывать некоторые методы до и после каждого вызова модуля запросов. Что-то вроде:

def get_resource(self, url, headers):
    self.add_request_header(headers)
    response = requests.get(url, headers, auth=self.auth)
    self.process_response_headers()
    return response

У меня проблемы с поиском способа сделать это без необходимости переписывать все Client методы. Самый простой способ - изменить вызовы модуля запроса на вызовы self и добавить вызовы к методам там.

def get_resource(self, url, headers):
    response = self.__get(url, headers, auth=self.auth)
    return response

def __get(self, headers, auth):
    self.add_request_header(headers)
    response = requests.get(url, headers, auth=self.auth)
    self.process_response_headers()
    return response

Но это требует от меня изменения всех сайтов вызовов и дублирования функциональности модуля запросов. Я пытался использовать декораторы, чтобы добавить эти вызовы методов к функциям модуля запроса, но застрял в том, как передать self в декоратор.

Я уверен, что есть элегантный способ сделать это в Python.

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Я думаю, что в этом случае декораторы не будут так хороши, как кажется, и ООП - лучший подход к вашей проблеме. Вы можете использовать базовый класс Client:

class Client(object):
    def __init__(self, auth):
        self.auth = auth

    def add_request_header(self, headers):
        pass

    def process_response_headers(self):
        pass

    def get_resource(self, url, headers):
        self.add_request_header(headers)
        response = requests.get(url, headers, auth=self.auth)
        self.process_response_headers()
        return response

И создайте другие подклассы с другими реализациями add_request_header и / или process_response_headers, поэтому позже вам просто нужно создать экземпляр класса, который лучше подходит для вашего случая

0 голосов
/ 17 сентября 2018

Вы можете использовать патч обезьян.Прочитайте это: Python: обезьяна, запечатывающая метод объекта

    import requests
    def get(self, url, params=None, **kwargs):
        self.add_request_header(self.headers)
        response = requests.get(url, self.headers, auth=self.auth)
        self.process_response_headers()
    setattr(requests.Session, 'get', requests.Session.get)
    s = requests.Session()
...