虽然开发中我想处理一些与我最终上传到Google服务器时不同的事情。在Python中,如何测试我是否在Google App Engine SDK中?
是否有快速测试,我可以做,以确定我是否在SDK或生活?
虽然开发中我想处理一些与我最终上传到Google服务器时不同的事情。在Python中,如何测试我是否在Google App Engine SDK中?
是否有快速测试,我可以做,以确定我是否在SDK或生活?
参见: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
”。
基于同样的伎俩,我在我的代码中使用此功能:
def isLocal():
return os.environ["SERVER_NAME"] in ("localhost", "www.lexample.com")
我为了能够在前面加上“L”来访问本地版本已经定制了自己的/etc/hosts
文件我的域名,这种方式很容易从本地传递到生产。
例子:
www.example.com
www.lexample.com
我更喜欢本地的'w3'子域名。 'w3.example.com'和'www.example.com' – guneysus 2014-12-24 12:18:47
我只是检查httplib的(这大约是AppEngine上的包装取出)
def _is_gae():
import httplib
return 'appengine' in str(httplib.HTTP)
这似乎不适用于'testbed'本地单元测试。 – 2013-03-27 17:32:20
我想指出,当App Engine内部时,'appengine'不再是'str(httplib.HTTP)'返回的字符串。实际的字符串是'gae_override.httplib.HTTP'。将测试更新到str(httplib.HTTP)中的'return'gae_override' – 2016-08-25 15:43:26
更通用的解决方案
一个更通用的解决方案并不意味着位于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",]
...
如果使用Mac系统,你可以写一个更通用的代码:
if socket.gethostname().endswith(".local"): # True in your local computer
...
Django开发必须把这个示例代码的文件settings.py
在该项目。
编辑:
根据杰夫奥尼尔在macOS高塞拉利亚socket.gethostname()
返回一个字符串以“.lan”结尾。
对于最新的Mac OS X,正确的后缀现在似乎是“.lan”。 – 2017-11-14 14:24:05
有趣的是,我只是在上周搬到Sierra,'socket.gethostname()'返回一个以“.local”结尾的字符串。 您正在运行High Sierra还是服务器版本的macOS? – ePi272314 2017-11-15 01:34:55
我刚刚升级到高塞拉利昂,所以必须是。 – 2017-11-15 02:44:46
感谢 这样的事情现在工作对我来说: 进口OS 高清发展(): 如果os.environ [ 'SERVER_SOFTWARE']。找到(“发展”)== 0: 返回True 其他: 返回False – user132262 2009-12-16 18:34:49
它吃了我的格式的评论,但你知道我的意思。干杯 – user132262 2009-12-16 18:35:39
简单:os.environ [ 'SERVER_SOFTWARE'] startswith( '发展') – 2009-12-21 01:35:37