【发布时间】:2020-10-04 14:48:30
【问题描述】:
我正在使用带有 urllib 的 Python 3.7。 一切正常,但当它收到 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 资源,我设置了一个带有一些授权信息和内容类型的标题。 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)
可能是什么问题?
【问题讨论】:
-
您访问的 URL 是什么? (不是您要重定向到的那个。)
-
我在 RFC 2616 上找到了这个:10.3.8 307 临时重定向 如果收到 307 状态代码以响应 GET 或 HEAD 以外的请求,则用户代理 不得自动重定向请求,除非用户可以确认,因为这可能会改变发出请求的条件。会不会是这个原因?
-
@calabrone 好声音。引用 HTTPRequestHandler 的 Python 文档:“某些 HTTP 重定向需要来自此模块的 client 代码的操作。如果是这种情况,则会引发 HTTPError。有关各种重定向代码的精确含义的详细信息,请参阅 RFC 2616 。” (我的重点)——所以你很可能对 307 是正确的。在这种情况下,你的
try-except可能算作“用户确认”......(docs.python.org/3/library/…) -
@mrblewog 是一个 https 网址。由于我的商业政策,我不想分享它。
-
不用担心——正如你在另一条评论中所说,这可能是对 307 的特殊处理。
标签: python http urllib http-redirect http-status-code-307