Python 请求 - 动态传递 HTTP 动词
Posted
技术标签:
【中文标题】Python 请求 - 动态传递 HTTP 动词【英文标题】:Python Requests - Dynamically Pass HTTP Verb 【发布时间】:2017-01-12 11:49:15 【问题描述】:有没有办法将 HTTP 动词 (PATCH/POST) 传递给函数并动态地使用该动词来处理 Python 请求?
例如,我希望此函数采用“动词”变量,该变量仅在内部调用,并且将 = post/patch。
def dnsChange(self, zID, verb):
for record in config.NEW_DNS:
### LINE BELOW IS ALL THAT MATTERS TO THIS QUESTION
json = requests.verb(headers=self.auth, url=self.API + '/zones/' + str(zID) + '/dns_records', data="type":record[0], "name":record[1], "content":record[2])
key = record[0] + "record with host " + record[1]
result = json.loads(json.text)
self.apiSuccess(result,key,value)
我意识到我不能像上面所说的那样请求“动词”,这是为了说明问题。有没有办法做到这一点或类似的东西?我想避免:
if verb == 'post':
json = requests.post(headers=self.auth, url=self.API + '/zones/' + str(zID) + '/dns_records', data="type":record[0], "name":record[1], "content":record[2]
else:
json = requests.patch(headers=self.auth, url=self.API + '/zones/' + str(zID) + '/dns_records', data="type":record[0], "name":record[1], "content":record[2]
谢谢大家!
【问题讨论】:
【参考方案1】:只需使用request()
方法。第一个参数是您要使用的 HTTP 动词。 get()
、post()
等只是request('GET')
、request('POST')
的别名:https://requests.readthedocs.io/en/master/api/#requests.request
verb = 'POST'
response = requests.request(verb, headers=self.auth,
url=self.API + '/zones/' + str(zID) + '/dns_records',
data="type":record[0], "name":record[1], "content":record[2]
)
【讨论】:
【参考方案2】:使用请求库,可以直接依赖 requests.request
方法(正如 Guillaume 的回答所建议的那样)。
但是,当遇到对具有相似调用签名的方法没有通用方法的库时,可以将所需方法的名称作为具有默认值的字符串提供 getattr
。也许喜欢
action = getattr(requests, verb, None)
if action:
action(headers=self.auth, url=self.API + '/zones/' + str(zID) + '/dns_records', data="type":record[0], "name":record[1], "content":record[2])
else:
# handle invalid action as the default value was returned
对于默认值,它可以是一个正确的操作,或者直接忽略它,就会引发异常;由您决定如何处理它。我将其保留为 None
,因此您可以在 else
部分处理替代情况。
【讨论】:
感谢您直接指出我。主要是坏蛋。 "getattr(object, name[, default]) 返回对象的命名属性的值。name 必须是字符串。如果字符串是对象属性之一的名称,则结果是该属性的值。对于例如,getattr(x, 'foobar') 等价于 x.foobar。如果命名属性不存在,如果提供则返回默认值,否则引发 AttributeError。" 您的解决方案有效,但依赖getattr()
通常被认为是丑陋的。我建议你看看我的解决方案,这要好得多,因为这是应该使用 requests
库的方式。
@Guillaume 是的,同意你的观点,我写的答案不考虑底层库,所以它被写成一个可以对付不实现像request
这样的通用方法的库的库.我确实想知道你为什么等了一年多才提出这个问题。以上是关于Python 请求 - 动态传递 HTTP 动词的主要内容,如果未能解决你的问题,请参考以下文章