2017-02-03 3 views
1

私はリクエストを取得するためのURLと認証パラメータを設定しています。私がこのように呼び出すと、認証エラー(401)が出ますが、コール上で明示的にauthを実行すると、何かがうまく動作します。なぜこのような方法でauthを組み込み、コールで正しく「爆発する」ことを期待できないのですか?Pythonは、認証が期待通りに処理されないように要求しています。

parms = [] 
parms.append(url) 
parms.append('auth=(''UID'', ''PWD'')') 
response = requests.get(*parms) 

これは認証を認識していないため、404となります。しかし、もし私がこれを行うと、それは動作します。私にとっては、これらは同じように見えます。一重引用符は、リストに適切に追加する文字列を得るためにのみ異なります。私は最初の方法は、2つのパラメータにつながるだろうと思った - URLと認証

parms = [] 
parms.append(url) 
response = requests.get(*parms, auth=('UID', 'PWD')) 

答えて

2

最初のものは、以下と等価です:

requests.get(url, "auth=('UID', 'PWD')") 

あなたが本当にしたい場合は:

requests.get(url, auth=('UID', 'PWD')) 

あなたは代わりにこれを使用する必要があります。

args = [] 
kwargs = {} 

args.append(url) 
kwargs['auth'] = ('UID', 'PWD') 

requests.get(*args, **kwargs) 

ルールは次のとおりです。

  • あなたは位置パラメータを使用しているfunction(foo, bar)を持っているとき、彼らは*argsに入ります。
  • function(foo=1, bar=2)という名前のパラメータを使用している場合は、**kwargsになります。
  • 両方を混在させることができます.Python 2では、名前付きパラメータの前に配置パラメータを配置する必要があります。
+0

ありがとうございました。もう1つの質問ですが、データベースから認証情報を引き出している場合は、「(UID、PWD)」の部分です。しかし、データベースから来るときは文字列です。辞書に渡すものは文字列ではなく、値( 'UID'、 'PWD')を一重引用符で囲まずに表示されます。辞書にデータベース結果を格納すると、 "TypeError: 'str 「オブジェクトは呼び出し可能ではありません 」データベース文字列を辞書で正しく取得するために呼び出されたものに変換するにはどうすればよいですか? – efultz

+1

2番目の問題を解消しました - kwargs ['auth'] = ast。 – efultz

+0

Nice! 'ast.literal_eval'は安全です(ユーザが提供するデータでは平らな' eval'を使わないでください) –

関連する問題