如何仅用python的urllib2库请求一次认证网址,而非两次

4 投票
1 回答
913 浏览
提问于 2025-04-16 15:11

通常,我们会使用 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错误信息后,才会发送认证信息。你可以通过创建子类来修改很多东西的行为,但看起来自己把信息编码到请求头里就简单多了,就像你在例子中做的那样。

撰写回答