我正在使用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
)
以下是对问题的一些猜测:
以下是我排除的一些假设:
生产网址提取和开发网址提取之间还有哪些其他差异?你对调试有任何想法吗?
更新2
(上面的第一次更新) 我不知道这是否是我所做的事情(可能会增加延迟或禁用上面提到的缓存),但现在生产环境的工作时间约为50%。这绝对看起来像一个竞争条件。不幸的是,我不知道问题是在我的代码,谷歌的代码还是目标服务器的代码中。
答案 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
,自那以来它一直运行良好。
希望这有助于其他人!