python - Google App Engine URL Fetch 不适用于生产环境

标签 python http google-app-engine urlfetch

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

我在 URL 提取中使用 cookie 和其他 header (我在 header 中手动设置 cookie)。其中一个 cookie 是 session cookie。

没有错误或异常。在生产环境中,向 URL 命令发送登录信息会返回 session cookie,但当您使用 session cookie 请求页面时,它们将被忽略并再次提示您输入登录信息。在开发中,一旦您获得 session 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 实现的分布式特性使事情变得一团糟。
  • 在生产环境中, header 的发送顺序与开发环境不同,这可能会使服务器感到困惑。
  • 一些 google 的服务器被目标服务器列入黑名单。

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

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

生产 URL 提取和开发 URL 提取之间还有哪些其他区别?你有什么调试的想法吗?

更新 2

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

最佳答案

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

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

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

关于python - Google App Engine URL Fetch 不适用于生产环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8288133/

相关文章:

java - 如何在JDO中唯一地识别和获取子对象

java - 多线程和 Google App Engine Servlet

python - 有没有办法从 .py 文件命令行创建 .ipynb?

python - 根据一些键/值对从字典列表中合并字典

python - 在 Python 套接字中缓存 HTTP GET REQUEST

java - 在 Google App Engine 开发服务器中使用 https 的最佳方式

python - 如何通过跳过 NaN 从数组/数据帧中获取第一个和最后一个数字对

python - 标记复杂输入

javascript - Angular js - 检测所有 $http() 何时完成

c# - ASP.NET Core 2 - 缺少内容类型边界