如何仅用python的urllib2库请求一次认证网址,而非两次
通常,我们会使用 Python 的 urllib2 库来请求一个认证的 URL,具体用法可以参考这个页面。不过,这样做会导致服务器接收到两次请求。第一次请求会返回一个 401 错误,接着客户端会把用户名和密码编码到认证头里,再发起第二次请求。如果你已经知道了认证的范围(realm)以及用户名和密码,其实可以只发一次请求。我可以通过把认证信息编码到请求头里来实现只请求一次,但我无法使用 HTTPPasswordMgrWithDefaultRealm 这个类来做到这一点。
只请求一次的代码:
import urllib2, base64 url = 'http://xxxx' username = 'jpx' passwd = 'jpx123' b64str = base64.encodestring('%s:%s' % (username, passwd)) req = urllib2.Request(url) auth = 'Basic %s' % b64str req.add_header('Authorization', auth) try: opener = urllib2.urlopen(req) except IOError, e: print str(e) print opener.read()
1 个回答
1
没错,这就是urllib
中的密码管理器是怎么工作的。它只有在收到服务器发来的401
错误信息后,才会发送认证信息。你可以通过创建子类来修改很多东西的行为,但看起来自己把信息编码到请求头里就简单多了,就像你在例子中做的那样。