2017-02-03 16 views
1

我有一個列表,其中我將一個請求獲取調用的url和身份驗證參數。如果我以這種方式嘗試呼叫,我會得到身份驗證錯誤(401),但是如果我明確地在呼叫中發現身份驗證,則會自行解決身份驗證問題。爲什麼我不能以這種方式包含身份驗證,並期望它在通話中正確「爆炸」?Python請求調用不按預期方式處理身份驗證

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

由於無法識別身份驗證,因此會導致404錯誤。但是,如果我這樣做的話。對我來說這些看起來是一樣的。單引號只有不同才能使字符串正確追加到列表中。我認爲會導致兩個參數,第一種方式 - 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

謝謝 - 這有助於很多。還有一個問題,如果我可能 - 我從數據庫中提取認證信息 - 「('UID','PWD')」部分。但是,當它來自數據庫時,它是一個字符串。它看起來是什麼傳遞給字典不是一個字符串,本身(值沒有單引號('UID','PWD')。如果我把我的數據庫結果放在字典中,我得到一個錯誤「TypeError:'str 'object is not callable 「。我如何將數據庫字符串轉換爲正確的字典? – efultz

+1

我想到了第二個問題 - 我做了以下 - kwargs ['auth'] = ast。 literal_eval(header [2])。這將字典值放入請求調用工作所需的表示形式。 – efultz

+0

Nice!'ast.literal_eval'是安全的(從不使用普通的'eval'和用戶提供的數據) –

相關問題