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 动词的主要内容,如果未能解决你的问题,请参考以下文章

如何在 GAE 中覆盖 HTTP 请求动词

HTTP动词是什么?(指HTTP的请求方式)

pyengine介绍及使用

Python Http 请求

Node.JS 中的 HTTP DELETE 动词

HTTP动词