Python urllib2 HTTP基本认证处理器
这里是代码:
import urllib2 as URL
def get_unread_msgs(user, passwd):
auth = URL.HTTPBasicAuthHandler()
auth.add_password(
realm='New mail feed',
uri='https://mail.google.com',
user='%s'%user,
passwd=passwd
)
opener = URL.build_opener(auth)
URL.install_opener(opener)
try:
feed= URL.urlopen('https://mail.google.com/mail/feed/atom')
return feed.read()
except:
return None
它运行得很好。唯一的问题是,当使用错误的用户名或密码时,打开网址 @
feed= URL.urlopen('https://mail.google.com/mail/feed/atom')
需要很长时间,根本没有任何错误提示,只是一直在执行这个打开网址的操作。
我该怎么知道用户名或密码是否不正确呢?
我想到了给这个功能设置一个超时,但这样的话,所有的错误,包括网络慢的情况,都会被当作认证错误。
1 个回答
3
这段代码应该会抛出一个错误,更准确地说是一个urllib2.HTTPError,错误代码是401。下面有一些调整过的代码供你参考。我保留了你原来的try/except结构,但其实不要使用通用的except语句,只捕捉你预期可能发生的错误!
def get_unread_msgs(user, passwd):
auth = URL.HTTPBasicAuthHandler()
auth.add_password(
realm='New mail feed',
uri='https://mail.google.com',
user='%s'%user,
passwd=passwd
)
opener = URL.build_opener(auth)
URL.install_opener(opener)
try:
feed= URL.urlopen('https://mail.google.com/mail/feed/atom')
return feed.read()
except HTTPError, e:
if e.code == 401:
print "authorization failed"
else:
raise e # or do something else
except: #A general except clause is discouraged, I let it in because you had it already
return None
我刚在这里测试过,运行得很好。