Как отладить запрос urllib2, который использует базовый обработчик аутентификации

#python #debugging #urllib2 #basic-authentication

#python #отладка #urllib2 #basic-аутентификация

Вопрос:

Я делаю запрос, используя urllib2 и тому HTTPBasicAuthHandler подобное, поэтому:

 import urllib2

theurl = 'http://someurl.com'
username = 'username'
password = 'password'

passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, theurl, username, password)

authhandler = urllib2.HTTPBasicAuthHandler(passman)
opener = urllib2.build_opener(authhandler)
urllib2.install_opener(opener)

params = "foo=bar"

response = urllib2.urlopen('http://someurl.com/somescript.cgi', params)

print response.info()
  

В настоящее время я получаю httplib.BadStatusLine исключение при запуске этого кода. Как я мог бы приступить к отладке? Есть ли способ узнать, каков необработанный ответ, независимо от нераспознанного кода состояния HTTP?

Ответ №1:

Вы пробовали устанавливать уровень отладки в своем собственном HTTP-обработчике? Измените свой код на что-то вроде этого:

 >>> import urllib2
>>> handler=urllib2.HTTPHandler(debuglevel=1)
>>> opener = urllib2.build_opener(handler)
>>> urllib2.install_opener(opener)
>>> resp=urllib2.urlopen('http://www.google.com').read()
send: 'GET / HTTP/1.1
      Accept-Encoding: identity
      Host: www.google.com
      Connection: close
      User-Agent: Python-urllib/2.7'
reply: 'HTTP/1.1 200 OK'
header: Date: Sat, 08 Oct 2011 17:25:52 GMT
header: Expires: -1
header: Cache-Control: private, max-age=0
header: Content-Type: text/html; charset=ISO-8859-1
... the remainder of the send / reply other than the data itself 
  

Итак, три строки для добавления:

 handler=urllib2.HTTPHandler(debuglevel=1)
opener = urllib2.build_opener(handler)
urllib2.install_opener(opener)
... the rest of your urllib2 code...
  

Это покажет необработанный цикл отправки / ответа HTTP в stderr.

Редактировать из комментария

Работает ли это?

 ... same code as above this line
opener=urllib2.build_opener(authhandler, urllib2.HTTPHandler(debuglevel=1))
... rest of your code
  

Комментарии:

1. Я где-то видел упоминание debuglevel параметра для HTTPHandler , но сайт, с которым я общаюсь, нуждается в базовой аутентификации, и, насколько я знаю HTTPBasicAuthHandler , у него нет опции отладки. Могу ли я что-нибудь еще сделать? Мне удалось найти причину моей проблемы (неверно сформированные параметры).

2. напомним, что параметры urllib2.build_opener() представляют собой список цепочек. Вы можете пометить свой отладочный http-обработчик на свой обработчик аутентификации… Смотрите пример.

3. С urllib2.build_opener(authhandler, urllib2.HTTPHandler(debuglevel=1)) помощью я получаю отладочный вывод, но обработчик аутентификации не работает, и я получаю 401 unauthorised . Я пробовал с порядком переключения обработчиков (не уверен, что это будет иметь какое-либо значение), и поведение было таким же.

4. Кроме того, распространенная ошибка: многим сайтам требуется имя пользователя as user=... и пароль as password=... , поэтому вам нужно добавить эти строки к фактическому пользователю и паролю.

5. Обратите внимание, что для https вам нужно изменить это на urllib2.HTTPSHandler(debuglevel= 1)