代码之家  ›  专栏  ›  技术社区  ›  MvdD

用pre和post方法调用装饰请求模块调用

  •  3
  • MvdD  · 技术社区  · 6 年前

    我有一个班叫 Client requests 与服务交互的模块。它有如下方法:

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

    现在我想在每次调用requests模块之前和之后调用一些方法。类似于:

    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
    

    我很难找到一个不用重写的方法 顾客

    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
    

    但这需要我更改所有的调用站点并复制请求模块的功能。我曾试图使用decorators将这些方法调用添加到请求模块函数中,但一直纠结于如何将self传递给decorator。

    我相信在Python中有一种优雅的方法可以做到这一点。

    2 回复  |  直到 6 年前
        1
  •  0
  •   Rahul Raut    6 年前

    你可以用猴子补丁。 请阅读: Python: Monkeypatching a method of an object

        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()
    
        2
  •  0
  •   edilio    6 年前

    我认为在这种情况下,decorators不会像听起来那么好,而OOP是解决问题的更好方法。您可以使用基类客户端:

    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