虽然开发我想要处理的一些事情与我最终上传到Google服务器时的情况略有不同。
我是否可以通过快速测试来了解我是在SDK还是在线?
答案 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>