雖然開發中我想處理一些與我最終上傳到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