web-dev-qa-db-ja.com

Pythonリクエスト-HTTP動詞を動的に渡す

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

みんなありがとう!

10
HectorOfTroy407

リクエストライブラリでは、 requests.request メソッドは直接信頼できます(ギヨームの答えが示唆しているように)。

ただし、同様の呼び出しシグネチャを持つメソッドのジェネリックメソッドを持たないライブラリに遭遇した場合、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のままにしました。

5
metatoaster

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