【问题标题】:Python's urllib2.urlopen() hanging with local connection to a Java Restlet serverPython 的 urllib2.urlopen() 挂起与 Java Restlet 服务器的本地连接
【发布时间】:2011-11-30 19:51:08
【问题描述】:

我正在尝试从 python 连接到本地运行的 Restlet 服务器,但连接无限挂起(如果我设置了超时,则会超时)。

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

如果我在 shell 中使用curl 打开上述 URL,结果会很快返回。如果我使用 urllib2 打开不同的本地服务(例如端口 8000 上的 Django Web 服务器),则 urllib2 可以正常工作。

我尝试禁用防火墙(我在 OS X 上这样做)。我尝试将 localhost 更改为 127.0.0.1。除了用户代理之外,来自 Restlet 的 curl 和 urllib2 连接的日志看起来都是一样的。

我的解决方法是通过subprocess 调用curl,但我宁愿理解为什么会失败。

这是我的 Restlet 资源的外观:

public class ContactResource extends ServerResource {

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

如果您需要更多信息/代码,请告诉我

【问题讨论】:

  • 如果您尝试不同的超时值会发生什么? urllib2.urlopen("...", timeout=1)?
  • 当 timeout=1 或 2 时,我得到“urllib2.URLError: ”并且handle.read() 返回空字符串
  • 您的 Restlet 应用程序是否旨在根据 User-Agent 或 Accept 标头更改行为?此外,您在日志中看到 urllib2 的评论意味着服务器确实看到它连接并响应它 - urllib2 只是认为响应没有通过?
  • 我的 Restlet 服务器非常基础(即遵循了一些教程),所以我没有添加任何用户代理/标头行为更改。我还应该提到,除了我的“/contact/123”网址不起作用之外,404 全面的页面(即“未找到请求的操作”)与 urllib 有相同的问题(无限期挂起)。
  • 尝试观察网络上的内容(使用有线嗅探器、netcat),其中一些有效,另一些无效。然后手动重复这些(“telnet localhost 8182”并输入请求),直到找出触发差异的原因。

标签: java python curl urllib2 restlet


【解决方案1】:

我遇到了类似的问题并最终使用了Requests package

【讨论】:

    【解决方案2】:

    urllib2 中有 ProxyHandler (http://docs.python.org/library/urllib2.html#urllib2.ProxyHandler)

    尝试在 urlopen 之前将空字典传递给它

    urllib2.ProxyHandler([])
    handle = urllib2.urlopen("http://localhost:8182/contact/123")
    

    【讨论】:

    • 上述代码从第一行产生错误:“AssertionError: proxies must be a mapping” (python 2.7)
    • @dolan 这是我的错误,对不起。正确的代码是urllib2.ProxyHandler({}),如文档“禁用自动检测代理传递一个空字典”中所述。
    • 那只是吐出“”,然后下一行仍然挂起。也许我应该以某种方式使用代理实例?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    相关资源
    最近更新 更多