virtualenv之间的无法解释的Urllib2问题。

时间:2011-09-22 01:51:41

标签: python http cookies urllib2 mechanize

我有一些测试代码(作为webapp的一部分),它使用urllib2执行我通常通过浏览器执行的操作:

  • 登录远程网站
  • 转到另一页
  • 填写表格
  • 执行POST

我在3台不同的机器上创建了4个独立的,干净的virtualenvs(带有--no-site-packages),所有机器都有不同版本的python但是完全相同的包(通过pip requirements文件),并且代码只能工作在我的本地开发机器上的两个虚拟机(2.6.1和2.7.2) - 它不适用于我的任何一个生产VPS

在失败的情况下,我可以成功登录,移动到正确的页面但是当我提交表单时,远程服务器回复告诉我发生了错误 - 这是一个应用程序服务器错误页面('我们无法'完成您的请求')而不是网络服务器错误。

  • 因为我可以成功登录并操作到第二页,这似乎不是会话或cookie问题 - 这对于最终的POST来说是特别的
  • 因为我可以使用EXACT相同的标题和数据在特定计算机上执行操作,这似乎不是我要求/发布的内容的问题
  • 因为我正在尝试从不同公司租用的两个单独的VPS上的代码,这对VPS物理环境来说似乎不是问题
  • 因为代码适用于2个不同的python版本,我无法想象它是一个无法解决的问题

在这个阶段我完全迷失了为什么这不起作用。我甚至'再次关闭它 - 因为我无法看清问题是什么。

我认为它必须与来自远程服务器不喜欢的VPS的最终POST有关,但我无法弄清楚它可能是什么。我觉得在URLlib的引擎下发生了一些导致远程服务器不喜欢回复的事情。

修改 我已经在VPS上安装了与我工作的本地副本完全相同的Python版本(2.6.1),并且它不能远程工作,因此它必须与源自VPS的事情有关。这怎么会影响Http请求?是低级别的吗?

4 个答案:

答案 0 :(得分:1)

您可以尝试为urllib2设置debuglevel = 1,看看它是什么:

import urllib2
h=urllib2.HTTPHandler(debuglevel=1)
opener = urllib2.build_opener(h)
...

答案 1 :(得分:1)

这是在黑暗中的总镜头,但你的VPS是64位还是你的家用电脑是32位,反之亦然?也许某些的默认大小或准确度的差异可能会吓跑服务器。

除此之外,您是否可以尝试查找Web服务器正在使用的软件堆栈上的任何信息?

答案 2 :(得分:1)

我遇到了与urllib2类似的问题(使用Zimbra的REST api),最终切换到pycurl成功。

PS 对于登录/导航/发布的操作,我通常发现Mechanize有用且更容易使用。也许你可以给它一个节目。

答案 3 :(得分:0)

好吧,看起来我知道为什么问题正在发生,但我不是100%的原因。

在执行第三次请求之前,我只需要在发送第二个请求(移动到另一个页面)之后使服务器等待(time.sleep())(执行POST填写表格)。

我不知道是因为第三方服务器的情况,还是URLlib的某种奇怪问题?它似乎在我的开发机器上运行的原因可能是因为它在运行代码时比服务器慢?