Как использовать HTTPPasswordMgrWithDefaultRealm () в Python - PullRequest
1 голос
/ 09 января 2009

Мне нужно написать некоторый ftp-код на python, который использует FTP-прокси. Прокси-сервер не требует аутентификации, но сервер FTP, к которому я подключаюсь, делает это. У меня есть следующий код, но я получаю «Ошибка ввода-вывода (ошибка ftp): 501 Формат пользователя: proxy-user: auth-method @ destination. Закрытие соединения». ошибка. Мой код:

import urllib2

proxies = {'ftp':'ftp://proxy_server:21'}
ftp_server = ' ftp.somecompany.com '
ftp_port='21'
username = 'aaaa'
password = 'secretPW'

password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm( )
top_level_url = ftp_server
password_mgr.add_password(None , top_level_url, username, password)

proxy_support = urllib2.ProxyHandler(proxies )
handler = urllib2.HTTPBasicAuthHandler(password_mgr )
opener = urllib2.build_opener(proxy_support )
opener = urllib2.build_opener(handler )
a_url = 'ftp://' + ftp_server + ':' + ftp_port + '/'
print a_url

try:
  data = opener.open(a_url )
  print data
except IOError, (errno, strerror):
  print "I/O error(%s): %s" % (errno, strerror)

Буду признателен за любую помощь, которую смогу получить.

Ответы [ 2 ]

2 голосов
/ 09 января 2009

Я использую следующий блок кода, который кажется похожим, за исключением того, что я включаю протокол в top_level_url, который я использую (и, конечно, это http).

Вы также можете попробовать позвонить install_opener после каждого build_opener вызова и затем использовать urllib2.urlopen

auth_handler = urllib2.HTTPBasicAuthHandler()
auth_handler.add_password(realm='RESTRICTED ACCESS',
                          uri='http://website.com',
                          user='username',
                          passwd='password')
opener = urllib2.build_opener(auth_handler)
urllib2.install_opener(opener)
urllib2.urlopen('http://website.com/....')
0 голосов
/ 15 ноября 2012

Я думаю, вам нужно изменить это:

    opener = urllib2.build_opener(proxy_support )
    opener = urllib2.build_opener(handler )

к этому:

    opener = urllib2.build_opener([proxy_support, handler])

Это дает вам один открывающий, который имеет как вашу аутентификацию, так и вашу поддержку прокси. Вам нужно использовать install_opener только в том случае, если вы хотите, чтобы пользовательская программа открывания использовалась при вызове urllib2.urlopen.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...