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

问题描述 投票:4回答:3

我正在使用谷歌应用引擎的urlfetch功能远程登录到另一个Web服务。 在开发过程中一切正常,但是当我转向生产时,登录过程失败了。 您对如何调试生产URL提取有任何建议吗?

我在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实现的分布式特性使得事情变得混乱。
  • 在生产时,标题以与开发中不同的顺序发送,可能会使服务器混乱。
  • 一些谷歌的服务器被目标服务器列入黑名单。

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

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

生产URL提取和开发URL提取之间还有哪些不同之处? 你对调试有什么想法吗?

更新2

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

python http google-app-engine urlfetch
3个回答
2
投票

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

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

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


1
投票

我在编写带有类似问题的webapp时遇到了这个问题 - 在查看urlfetch的文档时 ,发现fetch调用的最大超时为60秒,但默认为5秒。

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

我包含了参数deadline=60并且自那以后一直运行良好。

希望这有助于他人!


1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.