Python App Engine 调试/开发模式
我正在做一个App Engine项目(用Python),我们希望在调试和开发时对应用的行为做一些改变(大多数情况下是在本地)。比如,在调试时,我们想禁用速率限制的装饰器,开启WSGIApplication中的调试参数,可能还想添加一些断言。
据我了解,App Engine本身并没有一个全局的开发模式或调试模式,所以我在想怎么最好地实现这样的模式。目前我想到的选项有:
使用
google.appengine.api.app_identity.get_default_version_hostname()
来获取主机名,并检查它是否以localhost
开头。这似乎不太可靠,而且在已部署的应用实例中无法使用调试模式。使用
os.environ.get('APPLICATION_ID')
来获取应用的ID,根据这个页面,开发服务器会自动在前面加上dev~
。令人担忧的是,这个信息的来源有个警告:不要从环境变量中获取应用ID。开发服务器模拟生产的App Engine服务。它的一个做法是在
APPLICATION_ID
环境变量前加上一个字符串(dev~
),这与在生产环境中使用高复制数据存储的应用前加的字符串类似。你可以通过 --default_partition 标志来修改这个行为,选择一个值为""以匹配生产中的主从选项。谷歌建议总是使用 get_application_id 来获取应用ID,如上所述。我不确定这是否是环境变量的合理使用。无论如何,这可能同样是个hack,而且也只适用于本地运行的实例。
为开发(本地和已部署)使用自定义的应用ID,在
dev_appserver.py
中使用-A
标志,并在代码中使用google.appengine.api.app_identity.get_application_id()
。我不喜欢这个方案,原因有很多(主要是需要有两个独立的App Engine项目)。为开发使用一个
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 个回答
关于“检测”本地开发环境,我们在应用的设置或配置文件中使用以下内容。
IS_DEV_APPSERVER = 'development' in os.environ.get('SERVER_SOFTWARE', '').lower()
这和调试标志一起使用应该就能解决你的问题。