当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么AppEngine返回错误的应用程序ID?》经验,为你挑选了1个好方法。

App Engine Dev Server 文档说明如下:

开发服务器模拟生产App Engine服务.它执行此操作的一种方法是将string(dev~)添加到APPLICATION_ID环境变量中.Google建议始终使用应用程序IDget_application_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'.



1> Alex Martell..:

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前置到环境变量).它作为"分区"返回get_app_identity(忽略它,只在严格意义上返回应用程序ID).

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

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

在该示例中,重点是在生产中运行时访问Cloud SQL实例,而在本地运行时访问本地MySQL实例.但那是次要的 - 让我们关注一下,谷歌自己的例子如何判断案件是什么?相关代码是......:

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!...

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

好吧,作为一个Python大师,我实际上有点尴尬,我的同事正在使用这个稍微劣势的Python代码(有两个调用os.getenv) - 我,我将它编码如下......:

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表达(利用第二个可选参数os.getenv来提供默认值).

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


可以通过https://code.google.com/p/googleappengine/source/browse/#svn%2Ftrunk%2Fpython在线浏览所有SDK来源,也可以下载它们以便在本地计算机上进行浏览:https:/ /code.google.com/p/googleappengine/source/checkout以及许多其他方式.
推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有