python 3.7 urllib.request不跟随重定向URL

问题描述 投票:1回答:1

我正在将Python 3.7与urllib一起使用。一切正常,但在收到http重定向请求时似乎并没有进行自动重定向(307)。

这是我得到的错误:

ERROR 2020-06-15 10:25:06,968 HTTP Error 307: Temporary Redirect

我必须使用try-except处理它,然后手动将另一个请求发送到新位置:它工作正常,但我不喜欢它。

这是我用来执行请求的一段代码:

      req = urllib.request.Request(url)
      req.add_header('Authorization', auth)
      req.add_header('Content-Type','application/json; charset=utf-8')
      req.data=jdati  
      self.logger.debug(req.headers)
      self.logger.info(req.data)
      resp = urllib.request.urlopen(req)

URL是一个https资源,我设置了带有某些Authorization info e内容类型的标头。req.data是JSON

从urllib文档中,我已经发现重定向本身是由库本身以合法方式执行的,但是对我而言它不起作用。它始终会引发http 307错误,并且不遵循重定向URL。我也尝试过使用默认默认重定向处理程序的开启程序,但结果相同

  opener = urllib.request.build_opener(urllib.request.HTTPRedirectHandler)          
  req = urllib.request.Request(url)
  req.add_header('Authorization', auth)
  req.add_header('Content-Type','application/json; charset=utf-8')
  req.data=jdati  
  resp = opener.open(req)         

可能是什么问题?

python urllib http-redirect http-status-code-307
1个回答
0
投票

您未在评论部分的讨论中正确确定了不自动完成重定向的原因。具体来说,RFC 2617, Section 10.3.8指出:

如果响应其他请求而收到307状态代码 而不是GET或HEAD,用户代理不得自动重定向 请求,除非可以被用户确认,因为这可能 更改发出请求的条件。

返回问题-给定data,这将自动导致get_method返回POST(根据how this method was implemented),并且由于请求方法为POST,并且响应代码为307时,按照上述说明,将引发HTTPError。在Python的urllib上下文中,this specific section模块的urllib.request引发了异常。

为了进行实验,请尝试以下代码:

import urllib.request
import urllib.parse


url = 'http://httpbin.org/status/307'
req = urllib.request.Request(url)
req.data = b'hello'  # comment out to not trigger manual redirect handling
try:
    resp = urllib.request.urlopen(req)
except urllib.error.HTTPError as e:
    redirected_url = urllib.parse.urljoin(url, e.headers['Location'])
    resp = urllib.request.urlopen(redirected_url)
    print('Redirected -> %s' % redirected_url)  # the original redirected url 
print('Response URL -> %s ' % resp.url)  # the final url

按原样运行代码可能会产生以下结果

Redirected -> http://httpbin.org/redirect/1
Response URL -> http://httpbin.org/get 

请注意,随后的重定向到get是自动完成的,因为随后的请求是GET请求。注释掉req.data分配行将导致缺少“重定向”输出行。

此外,出于兴趣(出于链接目的),这个特定的问题之前已经被问过多次,而令他们惊讶的是,他们没有得到任何答案,这使我感到很惊讶:

© www.soinside.com 2019 - 2024. All rights reserved.