App Engine 忽略我的源代码更新和我的 app.yaml 文件

Posted

技术标签:

【中文标题】App Engine 忽略我的源代码更新和我的 app.yaml 文件【英文标题】:App Engine ignores my source-code-updates and my app.yaml file 【发布时间】:2012-11-27 18:19:29 【问题描述】:

我的 AppEngine 应用在我的桌面计算机上的开发服务器上运行良好,但我无法在 Google 的服务器上获取版本以关注我的源代码更新。

这是最有说服力的插图。我的 app.yaml 文件开头为:

application: xxxxxxxx
version: 1
runtime: python
api_version: 1

builtins:
- datastore_admin: on

handlers:
- url: /statix
  static_dir: statix

- url: /favicon\.ico
  static_files: favicon.ico
  upload: favicon\.ico

- url: .*
  script: main.py

最后一行将所有非静态 URL 路由到 main.py 文件。我们将这个版本的 main.py 称为“旧”版本。

在我对 main.py 进行了一些常规更改(从而创建了“新”版本)之后,问题就开始了。 “新”版本在我的 localhost 机器上运行良好,但在我部署到 GAE 后,它的更改无法通过 Big Internet 提供。相反,GAE 服务于由“旧”main.py 计算的页面。有时退出 GAE Launcher 并重新启动会有所帮助,但现在(几个小时)没有效果。即使机器重新启动。

因此,为了进行实验,我将 app.yaml 的最后一行更改为:

script: main2.py

我重新部署到 GAE,当我访问我的网站时,我收到 500 错误 - 正如预期的那样 - 因为项目中没有 main2.py 文件。

所以我将“新”的 main.py 磁盘文件重命名为 main2.py,重新部署到 GAE,然后 500 错误消失了——也如预期的那样。

但这就是奇怪的地方。这个刚刚上传的 main2.py 文件是“新”的 main.py,只是重命名了。但是,GAE 提供的页面是由“旧”main.py 计算的页面!

我已清除浏览器缓存。我什至启动了一个尘土飞扬的 Opera 副本,它从未见过该项目提供的 URL,而且它也显示“旧”main.py 创建的过时页面内容。

我已经使用 App Engine 几年了。一周前我从来没有遇到过这样的麻烦。我最近将 Launcher 更新到 1.7.3 (Mac OS X 10.6.8)。起初我以为我的 Launcher 不知何故损坏了,但 app.yaml 实验表明它是 GAE 本身的东西。我的 GAE 启动器中有很多项目,我真的不想进行全新安装。

我敢打赌,当我听到你的想法时,我会感到尴尬,但我已经没有想法了。

附录:用户dragonx建议缓存可能是问题的根源,现在我想起来了,确实是在我为应用程序配置了一个自定义域之后开始的,使用谷歌域名服务。但是,根据curl -D,这里是我的应用程序主页上的标题:

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Cache-Control: no-cache
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Vary: Accept-Encoding
Date: Tue, 11 Dec 2012 02:29:43 GMT
Server: Google Frontend
Transfer-Encoding: chunked

缓存似乎已关闭。尽管如此,我还是找不到如何返回 Google Domains 服务并关闭缓存。 :-(

附录#2:我将我的文件作为不同的应用程序上传(即我被允许的 10 个应用程序中的另一个)。他们提供更新。但是,当我对新上传的文件进行更改时,这些更改并没有出现。因此,无论出现什么问题,它似乎都会影响我用户帐户下的所有应用。

【问题讨论】:

将 app.yaml 中的版本改为 2. Deploy。从控制面板将服务的默认版本更改为 2。删除 1。问题可能会消失。 好主意——但是,唉,它并没有解决问题。 尝试删除然后从启动器中读取程序。 好主意。这也没有奏效。我从启动器中删除了应用程序,增加了 app.yaml 中的版本,将应用程序重新添加到启动器中,部署到 GAE,将当前版本设为默认,删除了旧版本,......仍然提供无情的旧页面. 【参考方案1】:

您是否设置了 HTTP 缓存标头?如果是这样,您可能会从一些中间缓存中获取结果,例如 GAE 的边缘缓存。

【讨论】:

我认为你是对的。回想起来,我的麻烦是在我设置了一个指向我的应用程序的自定义域之后开始的。我已经编辑了问题以提供更多信息。底线:我不知道如何关闭缓存。 看起来你设置了cache-control和expires header,expires header很奇怪。每个 URL 的缓存标头都是特定的,因此请检查未更新的页面。如果您碰巧为某些页面设置了较长的缓存期,那么您可能会被搞砸,直到这些缓存过期。您必须更改 URL 才能立即访问它。所以我的建议是:尝试更改 url,尝试比较来自您的域和来自您的应用程序 url 的结果,并确保您没有搞砸缓存标头。 另外,您是否将域设置为指向应用的特定版本? 更改涉及我的主页,因此确实没有更改 URL 的选项。在我设置域时,该应用程序只有一个版本。我不记得我是否指定了特定版本。无论如何,我设置域时存在的应用程序版本已被删除。我认为我现在唯一的选择是将我的源代码上传到一个新的 GAE 项目(基于一个新的 Gmail 帐户),将域重新指向新项目(这可能吗?),并希望最好。跨度> 实际上,我认为最有可能的是,您的新 main.py 并没有像您想象的那样做。你有没有真正调试过它以确保它服务于你认为它应该服务的东西?就像更改 main.py 以仅返回“Hello World”。【参考方案2】:

查看“版本”和“管理员日志”,您可能更新了错误的版本,即不是默认版本 https://appengine.google.com 也可以尝试不使用 cookie(cookie 有时会对更新产生奇怪的影响)

appcfg.py update . --no_cookies

【讨论】:

以上是关于App Engine 忽略我的源代码更新和我的 app.yaml 文件的主要内容,如果未能解决你的问题,请参考以下文章

Google App Engine、Jinja2 CSS 样式表未加载 (404)

为 App Engine 负载平衡器创建后端服务

App Engine:每次关闭计算机时都会清除开发数据存储区。如何避免这种情况?

App Engine 的替代/兼容数据存储?

如何在 Google App Engine 中设置我的默认版本

我的 Java App Engine GWT 应用程序的 Web 服务 API