#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=...
и пароль aspassword=...
, поэтому вам нужно добавить эти строки к фактическому пользователю и паролю.5. Обратите внимание, что для https вам нужно изменить это на urllib2.HTTPSHandler(debuglevel= 1)