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'.
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使用的文档中 - 所以,这是我们的文档蠢,并且,我道歉).但是,虽然我正在努力改进我们的文档,但我希望这个答案足以让你自信地继续下去.