在Python中,如何testing我是否在Google App Engine SDK中?

在开发的同时,我想要处理一些与我最终上传到Google服务器时不同的事情。

是否有一个快速testing,我可以做,以确定我是否在SDK或生活?

请参阅: https : //cloud.google.com/appengine/docs/python/how-requests-are-handled#Python_The_environment

以下环境variables是CGI标准的一部分,在App Engine中有特殊的行为: SERVER_SOFTWARE

开发Web服务器中 ,此值为“ Development/XY ”,其中“ XY ”是运行时的版本。

在App Engine上运行时 ,此值为“ Google App Engine/XYZ ”。

基于同样的技巧,我在我的代码中使用这个函数:

 def isLocal(): return os.environ["SERVER_NAME"] in ("localhost", "www.lexample.com") 

我已经定制了我的/etc/hosts文件,以便能够通过在我的域名前加一个“l”来访问本地版本,这样从本地传递到生产是非常容易的。

例:

  • 生产url是www.example.com
  • 发展url是www.lexample.com

我只是检查httplib(这是一个appengine获取包装)

 def _is_gae(): import httplib return 'appengine' in str(httplib.HTTP) 

更一般的解决scheme
一个更通用的解决scheme,并不意味着在谷歌服务器,将检测代码是否在本地机器上运行。
我正在使用下面的代码,无论服务器:

 import socket if socket.gethostname() == "your local computer name": DEBUG = True ALLOWED_HOSTS = ["127.0.0.1", "localhost", ] ... else: DEBUG = False ALLOWED_HOSTS = [".your_site.com",] ... 

如果你在MAC里,你可以写一个更通用的代码:

 if socket.gethostname().endswith(".local"): # True in your local computer ... 

如果您是Django开发人员,请将这些示例代码放在项目的“settings.py”中。

编辑:
据Jeff O'Neill介绍,在macOS中,高等级的Sierra socket.gethostname()将返回一个以“.lan”结尾的string,