2016-06-21 119 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并强调“不,你不能在一个查询中做到这一点“。谢谢你的时间! –