непоследовательное получение 401 ошибок от вызова python urllib2.urlopen - PullRequest
1 голос
/ 01 ноября 2011

У меня есть скрипт на python, который выполняет серию URL-вызовов с использованием urllib2.URL находится на http, но требует аутентификации.В настоящее время я пытаюсь запустить скрипт так, чтобы он сделал более 100 звонков.Каждый раз, когда я запускаю скрипт, некоторые вызовы завершаются с ошибкой с кодом 401, а некоторые проходят.Все звонки по одному и тому же URL с использованием одного и того же имени пользователя и пароля.(Каждый раз, когда я запускаю сценарий, это не те же вызовы, которые терпят неудачу, иногда первый вызов дает сбой, иногда он работает.)

Есть идеи, почему 401 может возникать непоследовательно?на экран выводится сообщение ...

Вот метод, который отвечает за вызов url:

def simpleExecuteRequest(minX, minY, maxX, maxY, type) :
    url = 'http://myhost.com/geowebcache/rest/seed/mylayer.xml'

    msgTemplate = """<?xml version=\"1.0\" encoding=\"UTF-8\"?>
    <seedRequest>
    <name>mylayer</name>
    <bounds>
    <coords>
    <double>%s</double>
    <double>%s</double>
    <double>%s</double>
    <double>%s</double>
    </coords>
    </bounds>
    <gridSetId>nyc</gridSetId>
    <zoomStart>0</zoomStart>
    <zoomStop>10</zoomStop>
    <format>image/png</format>
    <type>%s</type>
    <threadCount>1</threadCount>
    </seedRequest>
    """

    message = msgTemplate%(minX, minY, maxX, maxY, type)
    headers = { 'User-Agent' : "Python script", 'Content-type' : 'text/xml; charset="UTF-8"', 'Content-length': '%d' % len(message) }
    passwordManager = urllib2.HTTPPasswordMgrWithDefaultRealm()
    passwordManager.add_password(None, url, 'username', 'xxx')
    authenticationHandler = urllib2.HTTPBasicAuthHandler(passwordManager)
    proxyHandler = urllib2.ProxyHandler({})
    opener = urllib2.build_opener(proxyHandler, authenticationHandler)
    urllib2.install_opener(opener)    

    try :
        request = urllib2.Request(url, message, headers)
        response = urllib2.urlopen(request)
        content = response.read()
        print 'success'
    except IOError, e:
        print e

Иногда вывод будет выглядеть следующим образом ...

<urlopen error (10053, 'Software caused connection abort')>
success
success
<urlopen error (10053, 'Software caused connection abort')>
<urlopen error (10053, 'Software caused connection abort')>
...

При запуске через 1 минуту это может выглядеть следующим образом ...

success
<urlopen error (10053, 'Software caused connection abort')>
success
success
<urlopen error (10053, 'Software caused connection abort')>

На обоих запусках одинаковые серии входов для min / max x / y и типа были предоставлены в одном и том же порядке....

1 Ответ

0 голосов
/ 01 ноября 2011

Код выглядит правильно для меня, поэтому я не вижу проблемы.

Вот несколько мыслей о том, как действовать:

  • Я обычно работаю-вне HTTP-запросов в командной строке, используя curl перед переводом в сценарий.

  • Библиотека запросов проще в использовании, чем urllib2

  • Когда вы получите ответ, распечатайте заголовки, чтобы вы могли увидеть, что происходит

  • Вместо except IOError, e используйте except IOError as e.Новый способ защищает вас от труднодоступных ошибок.

  • Полагаю, вы отредактировали имя пользователя и пароль и используете реальные в своем скрипте; -)

...