gpt4 book ai didi

带装饰器的 Python "requests"

转载 作者:行者123 更新时间:2023-12-01 06:22:13 25 4
gpt4 key购买 nike

这是我正在尝试执行的代码:

import json
import requests

class Request(object):
def __init__(self, method, path):
self.method = method
## Q1
self.url = ''.join([***MyClass.host***, path])
self.h = {
"Content-Type": "application/json;charset=UTF-8"
}

def __call__(self, f):
def wrapper(*args, **kwargs):
# Q2
getattr(requests, self.method)(url = self.url, headers = h***, data = json.dumps(body)***)
return wrapper

class MyClass(object):
def __init__(self, host):
self.host = host

@Request(method = "post", path = "/add_mission")
def AddMission(self, mission):
body = {
"mission_id": mission
}

@Request(method = "get", path = "/system_info")
def GetInfo(self):
print("I want get info")

有一些问题希望有人能解决我的问题:
1. 我的装饰器“Request”如何从“MyClass”获取变量“host”? (评论## Q1)
2. 如何将函数的变量“body”传递给装饰器,可以吗? (在评论## Q2中)

因为我需要使用[post、get、delete]访问不同的url(主机+路径)。我不确定这种情况下装饰器不匹配吗?或者也许有更好的方法来处理这种情况?

最佳答案

一旦您通过调用对象的 host 属性调用修饰函数,主机就可用,因此请等到您实际调用该方法来构建 URL。您需要调用底层函数来获取一个值(如果有)作为负载。

import json
import requests

class Request(object):
def __init__(self, method, path):
self.method = method.upper()
self.h = {
"Content-Type": "application/json;charset=UTF-8"
}
self.path = path

def __call__(self, f):
def wrapper(obj, *args, **kwargs):
payload = f(*args, **kwargs)
args = {
'method': self.method,
'url': 'http://{}/{}'.format(obj.host, self.path),
'headers': self.h
}
if payload is not None:
args['json'] = payload
return requests.request(**args)
return wrapper


class MyClass(object):
def __init__(self, host):
self.host = host

@Request(method="post", path="/add_mission")
def AddMission(self, mission):
return {"mission_id": mission}

@Request(method="get", path="/system_info")
def GetInfo(self):
print("I want get info")

然后你可以写,例如,

api = MyClass("www.example.com")
add_response = api.AddMission("mars")
info_response = api.GetInfo()

每个修饰函数都会返回调用 requests.request 生成的 Response 对象。

您可以考虑为每个方法使用 Request 的子类:

class GetRequest(Request):
def __init__(self, path):
super().__init__("GET", path)

class PostRequest(Request):
def __init__(self, path):
super().__init__("POST", path)

# etc

关于带装饰器的 Python "requests",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60308891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com