2016-06-21 117 views
3

我有一個關於重定向後HTTP基本驗證的快速問題。Python請求 - 重定向後驗證

我想登錄到一個網站,出於運營的原因,我立即使用HTTP 302響應將我重定向到中央登錄網站。在我的測試中,似乎請求模塊在重定向後不會將我的憑證發送到中央登錄站點。正如下面的代碼片段所示,我不得不從響應對象中提取重定向URL並再次嘗試登錄。

我的問題是這樣的:
有沒有辦法強制請求重新發送登錄憑證後重新離線主機?

爲了便於攜帶,我不希望使用.netrc文件。此外,該網站的提供商已使url_login爲靜態,但沒有提出有關url_redirect的聲明。

謝謝你的時間!

代碼段

import requests 

url_login = '<url_login>' 
myauth = ('<username>', '<password') 

login1 = requests.request('get', url_login, auth=myauth) 
# this login fails; response object contains the login form information 

url_redirect = login1.url 
login2 = requests.request('get', url_redirect, auth=myauth) 
# this login succeeds; response object contains a welcome message 

UPDATE

這裏是上面的一般的代碼的一個更具體的版本。

  • 第一個request()返回一個HTTP 200響應並在其文本字段中包含表單信息。
  • 第二個request()在其文本字段中返回一個帶有'HTTP Basic: Access denied.'的HTTP 401響應。

(當然,當使用有效憑據提供的登錄成功。)

同樣,我想知道我是否能達到我想要的登錄只用一個調用requests.request()

import requests 

url_login = 'http://cddis-basin.gsfc.nasa.gov/CDDIS_FileUpload/login' 
myauth = ('<username>', '<password>') 

with requests.session() as s: 
    login1 = s.request('get', url_login, auth=myauth) 
    url_earthdata = login1.url 
    login2 = s.request('get', url_earthdata, auth=myauth) 
+0

你能分享網址嗎? –

+0

當然 - 網址是 http://cddis-basin.gsfc.nasa.gov/CDDIS_FileUpload/login,我想要做的更多細節可以在 http://cddis.gsfc找到.nasa.gov/Data_and_Derived_Products/CDDIS_File_Upload_Documentation.html。 我想保持我的問題儘可能一般,但如果這有幫助,繼續! –

+0

我想你想要一個會話,你想模仿curl邏輯嗎? –

回答

1

我對此的解決方案將使用「會話」。這裏是你如何實現會話。

import requests 

s = requests.session() 
url_login = "<loginUrl>" 

payload = { 
    "username": "<user>", 
    "password": "<pass>" 
} 

req1 = s.post(url_login, data=payload) 

# Now to make sure you do not get the "Access denied", use the same session variable for the request. 

req2 = s.get(url_earthdata) 

這應該可以解決您的問題。

+1

感謝您推薦使用會話 - 我相應地更新了我的帖子中的示例代碼。不幸的是,你在第二個命令「url_earthdata」中引用的url並不是事先知道的。爲登錄提供的url,url_login返回一個HTTP 302重定向到一個不保證是靜態的地址。我希望將我的憑證發送到第二個URL,而無需從第一次嘗試('url_earthdata = login1.url')中明確提取URL並執行第二次嘗試('login2 = s.request('get',url_earthdata,auth = myauth)') –

+1

在這種情況下,您可以在第一個請求中使用「allow_redirects = False」來獲取重定向URL。只需瀏覽您尋求的「url_earthdata」的第一個請求的標題即可。例如, >>> req1 = s.post(url_login,data = payload,allow_redirects = False) >>> url_earthdata = req1.headers [「」] – supersigdel

+0

好的,這是一個很好的提示 - 但它仍然需要兩個單獨的HTTP查詢。因爲我想了解更多有關重新定向脫機主機後重新發送登錄憑證的信息(即,只通過一個查詢實現登錄) - 如果您關注Sessions並強調「不,你不能在一個查詢中做到這一點「。謝謝你的時間! –