Python Requests - 动态传递 HTTP 动词

37

有没有一种方法可以将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)

我意识到我不能像上面那样请求'verb',那只是为了阐明问题。有没有办法做到这一点或类似的事情?我想避免一个:

I 理解我不能像上述那样请求“verb”,这只是为了解释问题。是否有方法实现此功能或类似功能?我希望避免出现:
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个回答

68

只需使用requests.request()方法,第一个参数是您想要使用的HTTP动词。 requests.get()requests.post()等仅是request('GET')request('POST')的别名:请参阅文档

您的代码将变为:

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]}
)

19
使用请求库,可以直接依靠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 异常。" - HectorOfTroy407
1
你的解决方案虽然可行,但依赖于 getattr() 通常被认为是不好的。我建议你看看我的解决方案,因为它更好,这是 requests 库应该使用的方式。 - Guillaume
1
@Guillaume 是的,我同意你的观点。我在回答时没有考虑到底层库,所以写成了一个可以针对不实现通用方法(如request)的库进行工作的答案。我很好奇为什么你要等一年多才提出这个问题。 - metatoaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接