在Python中,如何测试我是否在使用Google App Engine SDK?

时间:2009-12-16 18:14:31

标签: python google-app-engine

虽然开发我想要处理的一些事情与我最终上传到Google服务器时的情况略有不同。

我是否可以通过快速测试来了解我是在SDK还是在线?

7 个答案:

答案 0 :(得分:59)

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

  

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

     

开发网络服务器中,此值为“Development/X.Y”,其中“X.Y”是运行时的版本。

     

在App Engine上运行时,此值为“Google App Engine/X.Y.Z”。

答案 1 :(得分:6)

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

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

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

示例:

  • 生产网址为www.example.com
  • 开发网址为www.lexample.com

答案 2 :(得分:3)

我只检查httplib(这是一个围绕appengine fetch的包装)

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

答案 3 :(得分:2)

更通用的解决方案
更通用的解决方案(并不意味着在Google服务器上)会检测代码是否在本地计算机上运行。 无论托管服务器如何,我都在使用以下代码:

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",]
    ...

如果您使用macOS,您可以编写更通用的代码:

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

Django开发人员必须将此示例代码放在项目的文件settings.py中。

编辑:
根据Jeff O' Neill在macOS High Sierra中socket.gethostname()返回一个以" .lan"结尾的字符串。

答案 4 :(得分:2)

app.yaml中,您可以添加IS_APP_ENGINE环境变量

env_variables:
  IS_APP_ENGINE: 1

,然后在您的Python代码中检查是否已设置

if os.environ.get("IS_APP_ENGINE"):
    print("The app is being run in App Engine")
else:
    print("The app is being run locally")

答案 5 :(得分:1)

来自Google Cloud documentation的当前建议是:

if os.getenv('GAE_ENV', '').startswith('standard'):
  # Production in the standard environment
else:
  # Local execution.

答案 6 :(得分:0)

2020年10月更新:
我尝试使用os.environ["SERVER_SOFTWARE"]os.environ["APPENGINE_RUNTIME"],但两者均无效,因此我只记录了os.environ结果中的所有键。 在这些键中,有GAE_RUNTIME用来检查我是否在本地环境或云环境中。
确切的密钥可能会更改,或者您可以在app.yaml中添加您自己的密钥,但关键是登录os.environ,也许可以通过将其添加到测试网页中的列表中,然后使用其结果来检查您的环境。 / p>