Python请求 - 动态传递HTTP动词

时间:2016-09-05 06:32:08

标签: python http request httpverbs

有没有办法将HTTP动词(PATCH / POST)传递给函数并动态地将该动词用于Python请求?

例如,我希望这个函数采用一个'verb'变量,该变量只在内部调用,或者= 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]}

谢谢你们!

2 个答案:

答案 0 :(得分:17)

只需使用request()方法即可。第一个参数是您要使用的HTTP谓词。 get()post()等只是request('GET')request('POST')的别名:https://requests.readthedocs.io/en/master/api/#requests.request

verb = 'POST'
json = requests.request(verb, headers=self.auth, url=self.API + '/zones/' + str(zID) + '/dns_records', data={"type":record[0], "name":record[1], "content":record[2]})

答案 1 :(得分:5)

使用请求库,可以直接依赖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部分处理其他案例。