2016-09-05 8 views
2

HTTP動詞(PATCH/POST)を関数に渡して、その動詞をPythonリクエストに動的に使用する方法はありますか?Pythonリクエスト - 動的にHTTP動詞を渡す

たとえば、この関数は、内部でのみ呼び出され、= post/patchのどちらかになる 'verb'変数を使用します。

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

リクエストライブラリを使用すると、requests.requestメソッドは直接(Guillaumeの回答が示唆しているように)依存することができます。

しかし、同様の呼び出しシグネチャを持つメソッドの汎用メソッドを持たないライブラリに遭遇した場合は、希望のメソッドの名前を既定値の文字列として指定することができます。おそらく

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セクションの別のケースに対処することができます。

+0

感謝を。主に悪いgetattr(object、name [、default]) objectの名前付き属性の値を返します。nameは文字列でなければなりません。文字列がオブジェクトの属性の名前であれば、結果はその属性の値になります。たとえば、getattr(x、 'foobar')はx.foobarと等価です。指定された属性が存在しない場合は、指定されていればdefaultが返され、それ以外の場合はAttributeErrorが返されます。 – HectorOfTroy407

+1

あなたの解決策は動作しますが、 'getattr()'に依存するのは一般的には醜いと見なされます。私は、あなたが私の解決策を見ることを提案します。これは、 '要求' libが使われるはずの方法であるためです。 – Guillaume

+0

@Guillaumeええ、あなたに同意します。基本的なライブラリに関係なく答えを書いたので、 'request'のような一般的なメソッドを実装していないライブラリに対して動作するものとして書かれています。私はなぜこれをもたらすために1年以上待っているのだろうかと思います。 – metatoaster

7

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]}) 
関連する問題