Python urllib2.urlopen() зависает при локальном подключении к серверу Java Restlet

Я пытаюсь подключиться к локальному запущенному серверу Restlet из python, но соединение бесконечно зависает (или истекает время ожидания, если я установил тайм-аут).

import urllib2
handle = urllib2.urlopen("http://localhost:8182/contact/123") # hangs

Если я использую curl из оболочки, чтобы открыть вышеуказанный URL-адрес, результаты возвращаются быстро. Если я использую urllib2 для открытия другой локальной службы (например, веб-сервера Django на порту 8000), urllib2 работает нормально.

Я попытался отключить брандмауэр (я делаю это в OS X). Я попытался изменить локальный хост на 127.0.0.1. Журналы из Restlet для соединения curl и urllib2 выглядят одинаково, за исключением пользовательского агента.

Мой обходной путь состоял бы в том, чтобы просто вызвать curl через subprocess, но я бы предпочел понять, почему это не удается.

Вот как выглядит мой ресурс Restlet:

public class ContactResource extends ServerResource {

  @Get
  public String represent() throws Exception {
    return "<contact details>";
  }
  //....
}

Дайте мне знать, если вам нужна дополнительная информация/код


person Dolan Antenucci    schedule 30.11.2011    source источник
comment
Что произойдет, если вы попробуете разные значения времени ожидания? urllib2.urlopen("...", timeout=1)?   -  person Seth    schedule 30.11.2011
comment
При timeout=1 или 2 я получаю urllib2.URLError: ‹urlopen error timed out› и handle.read() возвращает пустую строку   -  person Dolan Antenucci    schedule 01.12.2011
comment
Ваше приложение Restlet предназначено для изменения поведения на основе заголовков User-Agent или Accept? Кроме того, ваш комментарий о том, что вы видите urllib2 в журнале, подразумевает, что сервер видит, что он подключается, и отвечает на него - urllib2 просто не думает, что ответ когда-либо приходит?   -  person David K. Hess    schedule 01.12.2011
comment
Мой сервер Restlet очень простой (т.е. следовал некоторым из руководств), поэтому я не добавлял никаких изменений в поведении пользовательского агента/заголовка. Я также должен упомянуть, что помимо того, что мой URL-адрес /contact/123 не работает, на странице 404 (т.е. запрошенное действие не найдено) есть та же проблема с urllib (зависает на неопределенный срок).   -  person Dolan Antenucci    schedule 01.12.2011
comment
Попробуйте посмотреть, что происходит в сети (используя анализатор проводов, netcat), что-то работает, а что-то нет. Затем повторите это вручную (telnet localhost 8182 и введите запрос), пока не выясните, что вызывает разницу.   -  person Andrew Dalke    schedule 06.12.2011
comment
@AndrewDalke - спасибо, я попробую это и скоро продолжу   -  person Dolan Antenucci    schedule 07.12.2011
comment
Резолвер DNS перепутан? Попробуйте использовать 127.0.0.1 вместо localhost   -  person Dog eat cat world    schedule 09.05.2012


Ответы (2)


Я столкнулся с похожими проблемами и в итоге использовал пакет Requests.

person yongwen    schedule 09.05.2012

есть ProxyHandler ( http://docs.python.org/library/urllib2.html#urllib2.ProxyHandler ) в urllib2

попробуйте передать ему пустой словарь перед urlopen

urllib2.ProxyHandler([])
handle = urllib2.urlopen("http://localhost:8182/contact/123")
person lig    schedule 06.12.2011
comment
Приведенный выше код генерирует ошибку из первой строки: AssertionError: proxys must be a mapping (python 2.7) - person Dolan Antenucci; 09.12.2011
comment
@dolan, это моя ошибка, извини. Правильный код urllib2.ProxyHandler({}), как указано в документах. Чтобы отключить автоматически определяемый прокси-сервер, передайте пустой словарь. - person lig; 10.12.2011
comment
Это просто выдало экземпляр ‹urllib2.ProxyHandler по адресу 0x1006370e0›, затем следующая строка все еще зависла. Может быть, я должен каким-то образом использовать экземпляр прокси? - person Dolan Antenucci; 10.12.2011