App Engine开发服务器documentation说明如下:
开发服务器模拟生产App Engine服务。执行此操作的一种方法是将字符串(
获取应用程序IDdev~
)添加到APPLICATION_ID
环境变量中。 Google建议始终使用get_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'。
答案 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。