Python App Engine 调试/开发模式

4 投票
1 回答
1366 浏览
提问于 2025-04-18 17:06

我正在做一个App Engine项目(用Python),我们希望在调试和开发时对应用的行为做一些改变(大多数情况下是在本地)。比如,在调试时,我们想禁用速率限制的装饰器,开启WSGIApplication中的调试参数,可能还想添加一些断言。

据我了解,App Engine本身并没有一个全局的开发模式或调试模式,所以我在想怎么最好地实现这样的模式。目前我想到的选项有:

  1. 使用 google.appengine.api.app_identity.get_default_version_hostname() 来获取主机名,并检查它是否以 localhost 开头。这似乎不太可靠,而且在已部署的应用实例中无法使用调试模式。

  2. 使用 os.environ.get('APPLICATION_ID') 来获取应用的ID,根据这个页面,开发服务器会自动在前面加上 dev~。令人担忧的是,这个信息的来源有个警告:

    不要从环境变量中获取应用ID。开发服务器模拟生产的App Engine服务。它的一个做法是在 APPLICATION_ID 环境变量前加上一个字符串(dev~),这与在生产环境中使用高复制数据存储的应用前加的字符串类似。你可以通过 --default_partition 标志来修改这个行为,选择一个值为""以匹配生产中的主从选项。谷歌建议总是使用 get_application_id 来获取应用ID,如上所述。

    我不确定这是否是环境变量的合理使用。无论如何,这可能同样是个hack,而且也只适用于本地运行的实例。

  3. 为开发(本地和已部署)使用自定义的应用ID,在 dev_appserver.py 中使用 -A 标志,并在代码中使用 google.appengine.api.app_identity.get_application_id()。我不喜欢这个方案,原因有很多(主要是需要有两个独立的App Engine项目)。

  4. 为开发使用一个 dev 的App Engine 版本,并在代码中用 os.environ.get('CURRENT_VERSION_ID').split('.')[0] 来检测。当部署时,这很简单,但我不确定如何让 dev_appserver.py 使用自定义版本而不修改 app.yaml。我想我可以用 sed 将 app.yaml 复制到 /tmp/ 的临时文件中,替换版本并解析相对路径(或者直接创建一个持久的 dev-app.yaml),然后将其传递给 dev_appserver.py。但这似乎也有点麻烦,容易出错或出现同步问题。

我是不是漏掉了其他方法?有没有我没有考虑到的因素?还有其他建议吗?

1 个回答

3

关于“检测”本地开发环境,我们在应用的设置或配置文件中使用以下内容。

IS_DEV_APPSERVER = 'development' in os.environ.get('SERVER_SOFTWARE', '').lower()

这和调试标志一起使用应该就能解决你的问题。

撰写回答