为什么App Engine返回错误的应用程序ID?

时间:2015-12-29 22:06:28

标签: python google-app-engine

App Engine开发服务器documentation说明如下:

  

开发服务器模拟生产App Engine服务。执行此操作的一种方法是将字符串(dev~)添加到APPLICATION_ID环境变量中。 Google建议始终使用get_application_id

获取应用程序ID

在我的应用程序中,我在本地使用不同的资源,而不是在生产中使用。因此,当我启动App Engine实例时,我有以下内容:

import logging

from google.appengine.api.app_identity import app_identity
# ...
# other imports
# ...

DEV_IDENTIFIER = 'dev~'
application_id = app_identity.get_application_id()
is_development = DEV_IDENTIFIER in application_id

logging.info("The application ID is '%s'")
if is_development:
    logging.warning("Using development configuration")

    # ...
    # set up application for development
    # ...

 # ...

然而,当我通过命令行dev_appserver.py app.yaml启动本地开发服务器时,我在控制台中得到以下输出:

INFO: The application ID is 'development-application'
WARNING: Using development configuration

显然,缺少文档声明的dev~标识符将预先填入我的应用程序ID。我还尝试使用App Engine Launcher UI来查看是否有任何改变,但事实并非如此。

请注意,'development-application'是我实际应用程序的名称,但我希望它是'dev~development-application'。

2 个答案:

答案 0 :(得分:6)

  

Google建议始终使用get_application_id

获取应用程序ID

但是,如果你关心应用程序ID ,那就不用了:你不关心分区。查看来源 - 它发布在https://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/api/app_identity/app_identity.py

get_app_identity使用os.getenv('APPLICATION_ID')然后将其传递给内部函数_ParseFullAppId - 将其按_PARTITION_SEPARATOR = '~'拆分(从而再次删除dev~前缀dev_appserver.py 1}}前置于环境变量)。这是"分区"到get_app_identity(忽略它,只在严格意义上返回应用程序ID)。

不幸的是,没有架构方法可以获得分区(实际上你只关心它)。

我建议,区分您是在本地运行还是在生产中运行" (即,在appspot.com上的Google服务器上),为了在每种情况下访问不同的资源,您可以从Google自己的示例中获取灵感 - 具体来说,请查看{{ 1}} https://cloud.google.com/appengine/docs/python/cloud-sql/#Python_Using_a_local_MySQL_instance_during_development处的示例。

在该示例中,重点是如果您在生产中运行,则访问Cloud SQL实例,而如果您在本地运行,则访问本地MySQL实例。但这是次要的 - 让我们关注一下,谷歌自己的例子如何说明情况是什么?相关代码是......:

app.py

所以,这是我建议您使用的测试。

嗯,作为一个Python大师,我实际上有点尴尬,我的同事正在使用这个略逊一筹的Python代码(两次调用if (os.getenv('SERVER_SOFTWARE') and os.getenv('SERVER_SOFTWARE').startswith('Google App Engine/')): ...snipped: what to do if you're in production!... else: ...snipped: what to do if you're in the local server!... ) - 我,我代码它如下......:

os.getenv

但是,这是完全相同的语义,只是用更优雅的Python表达(利用in_prod = os.getenv('SERVER_SOFTWARE', '').startswith('Google App Engine/') if in_prod: ...whatever you want to do if we're in production... else: ...whatever you want to do if we're in the local server... 的第二个可选参数来提供默认值)。

我正试图将这个小的Python改进纳入该示例,并将其放在您正在使用的文档页面中(没有任何理由只需要找出他们的应用程序是在prod或本地运行应该看过有关Cloud SQL使用的文档 - 所以,这个 是我们的文档蠢,我道歉)。但是,虽然我正在努力改进我们的文档,但我希望这个答案足以让你自信地继续下去。

答案 1 :(得分:2)

该文档似乎有误,当我在本地运行命令时,它只是从app.yaml中吐出名称。

话虽如此,我们使用

import os
os.getenv('SERVER_SOFTWARE', '').startswith('Dev')

检查它是否是dev appserver。