我是 Python 新手,如果我遗漏了一些明显的东西,请原谅我。
我正在使用 urllib.FancyURLopener 来检索 Web 文档。在 Web 服务器上禁用身份验证时它可以正常工作,但在启用身份验证时会失败。
我的猜测是我需要继承 urllib.FancyURLopener 来覆盖 get_user_passwd() 和/或 prompt_user_passwd() 方法。所以我做了:
class my_opener (urllib.FancyURLopener):
# Redefine
def get_user_passwd(self, host, realm, clear_cache=0):
print "get_user_passwd() called; host %s, realm %s" % (host, realm)
return ('name', 'password')
然后我尝试打开页面:
try:
opener = my_opener()
f = opener.open ('http://1.2.3.4/whatever.html')
content = f.read()
print "Got it: ", content
except IOError:
print "Failed!"
我希望 FancyURLopener 能够处理 401,调用我的 get_user_passwd(),然后重试请求。
它不是; 当我调用“f = opener.open()”时,我得到了 IOError 异常。
Wireshark 告诉我请求已发送,并且服务器正在发送带有两个感兴趣的标头的“401 Unauthorized”响应:
WWW-Authenticate: BASIC
Connection: close
然后连接关闭,我发现我的异常,一切都结束了。
即使我在 IOError 之后重试“f = opener.open()”,它也会以同样的方式失败。
我已经验证了我的 my_opener() 类正在通过使用简单的“print 'Got 401 error'”覆盖 http_error_401() 方法来工作。我也尝试过覆盖 prompt_user_passwd() 方法,但这也没有发生。
我看不到主动指定用户名和密码的方法。
那么如何让 urllib 重试请求呢?
谢谢。