Python 谷歌应用程序引擎URL获取不';我不从事生产

Python 谷歌应用程序引擎URL获取不';我不从事生产,python,http,google-app-engine,urlfetch,Python,Http,Google App Engine,Urlfetch,我正在使用google app engine的urlfetch功能远程登录到另一个web服务。在开发过程中一切正常,但当我进入生产阶段时,登录过程失败。对于如何调试生产URL获取,您有什么建议吗 我在URL获取中使用Cookie和其他标题(我在标题中手动设置Cookie)。其中一个cookie是会话cookie 没有错误或例外。在生产中,将登录发布到URL命令将返回会话cookie,但当您使用会话cookie请求页面时,它们将被忽略,并再次提示您输入登录信息。在开发中,一旦获得会话cookie,

我正在使用google app engine的urlfetch功能远程登录到另一个web服务。在开发过程中一切正常,但当我进入生产阶段时,登录过程失败。对于如何调试生产URL获取,您有什么建议吗

我在URL获取中使用Cookie和其他标题(我在标题中手动设置Cookie)。其中一个cookie是会话cookie

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

我这样称呼它:

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获取实现的分布式特性把事情搞砸了
  • 在生产环境中,头文件的发送顺序与开发环境中的不同,这可能会使服务器感到困惑
  • 谷歌的一些服务器被目标服务器列入黑名单
以下是我已经排除的一些假设:

  • 谷歌缓存太激进了。但在使用header cache控件关闭缓存后,我仍然遇到了这个问题:no store
  • 谷歌的urlfetch对于目标服务器来说太快了。但在两次通话之间插入延迟后,我仍然会遇到问题
  • 谷歌在用户代理标题中添加了一些数据。但我已经在开发中添加了标题,我不明白这个问题
生产URL获取和开发URL获取之间还有哪些区别?你对调试这个有什么想法吗

更新2

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

检查您服务器的日志,看看GAE是否正在删除任何头文件。我注意到GAE(我想我在dev服务器上看到过)会切掉它不喜欢的头文件


根据您正在调用的web服务的不同,GAE调用它可能比您的本地计算机更不合适。

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

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


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

我在制作一个具有类似问题的Web应用程序时遇到了这个问题-当查看时,发现获取调用的最大超时为60秒,但默认为5秒

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

我加入了参数
deadline=60
,从那以后它一直运行良好


希望这能帮助别人

除了“不起作用”之外,您还没有提供任何详细信息-运行此代码时会发生什么?您是否尝试将其指向您控制的站点,以便记录传入的请求?好主意。我试着把它指向一个控制站点,我已经区分了两个请求对象。他们几乎一模一样。也许谷歌IP是被列入黑名单的,我不确定。你还没有解释在这种情况下“不工作”是什么意思。我在我原来的帖子中解释说登录过程失败了。我对它进行了编辑以添加更多细节。你到底为什么要用cookies向自己提出请求?谢谢你的建议。(1) 我看到了与您提到的相同的东西,应用程序id被附加到用户代理。我不知道这是否是问题的原因,我不确定。(2) 我不打算在开发人员和产品之间重复使用会话。(3)我将在一个纯django安装上尝试同样的方法,看看它是如何运行的。