【发布时间】:2014-10-06 10:23:56
【问题描述】:
我正在开发一个 App Engine 项目 (Python),我们希望在调试/开发时(通常在本地)对应用的行为进行某些更改。例如,在调试时,我们想禁用限速装饰器,打开 WSGIApplication 中的调试参数,或者添加一些断言。
据我所知,App Engine 自然没有任何全局开发模式或调试模式的概念,所以我想知道如何最好地实现这种模式。到目前为止我能想到的选项:
使用
google.appengine.api.app_identity.get_default_version_hostname()获取主机名并检查它是否以localhost开头。这似乎...不可靠,并且不允许在已部署的应用实例中使用调试模式。-
使用
os.environ.get('APPLICATION_ID')获取应用程序ID,根据this page,开发服务器会自动添加dev~。令人担忧的是,这些信息的真正来源是在一个警告框中:不要从环境变量中获取 App ID。发展历程 服务器模拟生产 App Engine 服务。一种方式 它这样做是在
APPLICATION_ID前面添加一个字符串(dev~) 环境变量,类似于前面的字符串 使用 High Replication Datastore 的应用程序的生产。你 可以使用 --default_partition 标志修改此行为,选择一个 "" 的值以匹配生产中的主从选项。谷歌 建议始终使用 get_application_id 获取应用程序 ID, 如上所述。不确定这是否是环境变量的可接受使用。无论哪种方式,它都可能同样 hacky,并且遇到仅使用本地运行实例的相同问题。
使用自定义 app-id 进行开发(本地和部署),在
dev_appserver.py中使用-A标志,并在代码中使用google.appengine.api.app_identity.get_application_id()。我不喜欢这样的原因有很多(即必须有两个独立的应用引擎项目)。使用
dev应用程序引擎version 进行开发,并在代码中使用os.environ.get('CURRENT_VERSION_ID').split('.')[0]进行检测。部署时这很容易,但我不确定如何在不修改 app.yaml 的情况下让 dev_appserver.py 使用自定义版本。我想我可以sedapp.yaml 到/tmp/中的一个临时文件,替换版本并解析相对路径(或者只是创建一个持久的 dev-app.yaml),然后将其传递给 dev_appserver.py。但这似乎也有点脏,容易出现错误/同步问题。
我是否缺少其他方法?有什么我没有承认的考虑吗?还有其他建议吗?
【问题讨论】:
-
你可以在命令行中指定使用dev_appserver.py时要使用的app.yaml文件。例如,我在 development.yaml 中有本地 SQL 设置,但部署时它会自动切换到 app.yaml
-
是的,这是 #4 的一部分。
-
为什么选项 1“似乎”不可靠。以及如何排除使用调试模式。调试模式的控制肯定会独立于它在哪里运行开发或生产?
-
为什么不在这里只使用答案:stackoverflow.com/questions/1916579/…
-
@TimHoffman:我想我只是不知道应用程序是如何在 prod 中运行的,方法 #1 根据运行位置定义了开发模式。不过,我同意它应该是独立的。
标签: python google-app-engine testing development-environment