Google App Engine网址提取在生产中不起作用

时间:2011-11-27 18:55:50

标签: python http google-app-engine urlfetch

我正在使用google app engine的urlfetch功能远程登录其他网络服务。在开发过程中一切正常,但是当我转向生产时,登录过程失败了。您对如何调试生产URL提取有任何建议吗?

我在网址抓取中使用Cookie和其他标头(我手动设置标头内的Cookie)。其中一个cookie是会话cookie。

没有错误或异常。在生产时,发布URL命令的登录会返回会话cookie,但是当您使用会话cookie请求页面时,它们将被忽略,并再次提示您输入登录信息。在开发一旦你获得会话cookie,你可以访问内部页面就好了。我认为问题与保存cookie有关,但它们看起来正确,因为请求几乎相同。

这就是我所说的:

fetchresp = urlfetch.fetch(url=req.get_full_url(),
    payload=req.get_data(),
    method=method,
    headers=all_headers,
    allow_truncated=False,
    follow_redirects=False,
    deadline=10
    )

以下是对问题的一些猜测:

  • google的url fetch实现的分布式特性令人不快。
  • 在制作时,标题的发送顺序与开发顺序不同,可能会使服务器混乱。
  • 某些Google服务器被目标服务器列入黑名单。

以下是我排除的一些假设:

  • 谷歌缓存过于激进。但是,在使用标头Cache-Control:no-store。
  • 关闭缓存后,我仍然遇到了问题
  • Google的urlfetch对目标服务器来说太快了。但是在呼叫之间插入延迟后我仍然遇到问题。
  • Google会将一些数据附加到User-Agent标头。但我已将该标题添加到开发中,但我没有遇到问题。

生产网址提取和开发网址提取之间还有哪些其他差异?你对调试有任何想法吗?

更新2

(上面的第一次更新) 我不知道这是否是我所做的事情(可能会增加延迟或禁用上面提到的缓存),但现在生产环境的工作时间约为50%。这绝对看起来像一个竞争条件。不幸的是,我不知道问题是在我的代码,谷歌的代码还是目标服务器的代码中。

3 个答案:

答案 0 :(得分:2)

正如其他人所提到的,dev和prod之间的主要区别是原始IP,以及如何处理某些请求标头。有关受限标题的列表,请参阅here。我不知道这是否有记录,但是在prod中,您的应用ID会附加到您的用户代理的末尾。我有一个问题,因为我的应用程序ID包含字符串“bot”,因此只有prod中的请求被检测为搜索引擎蜘蛛。

您提到您手动设置Cookie,包括会话Cookie。这是否意味着你在Dev中建立了一个会话,然后你试图在prod中重新使用它?远程服务器是否可能记录建立会话的源IP,并要求后续请求来自同一IP?

你说它不起作用,但你没有例外。这到底是什么意思?你得到一个HTTP 200和一个空响应体?另一个HTTP状态?您最好的选择可能是联系远程服务的所有者,看看他们是否可以更具体地告诉您您的请求有什么问题。其他任何事情都只是猜测。

答案 1 :(得分:1)

检查服务器的日志,看看GAE是否正在关闭任何标头。我注意到GAE(以为我认为我在开发服务器上看过它)会切掉它不喜欢的标题。

根据您正在呼叫的网络服务,GAE呼叫它可能不如您的本地计算机。

答案 2 :(得分:1)

我在编写带有类似问题的webapp时遇到了这个问题 - 在查看urlfetch's documentation时,结果显示获取调用的最大超时为60秒,但默认为5秒。

本地计算机上的

5秒足以在本地计算机上请求URL,但在GAE上,它只在大约20%的时间内在5秒内完成任务。

我添加了参数deadline=60,自那以来它一直运行良好。

希望这有助于其他人!