2009-12-16 46 views

回答

56

參見: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」。

+2

感謝 這樣的事情現在工作對我來說: 進口OS 高清發展(): 如果os.environ [ 'SERVER_SOFTWARE']。找到(「發展」)== 0: 返回True 其他: 返回False – user132262 2009-12-16 18:34:49

+0

它吃了我的格式的評論,但你知道我的意思。乾杯 – user132262 2009-12-16 18:35:39

+18

簡單:os.environ [ 'SERVER_SOFTWARE'] startswith( '發展') – 2009-12-21 01:35:37

6

基於同樣的伎倆,我在我的代碼中使用此功能:

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

我爲了能夠在前面加上「L」來訪問本地版本已經定製了自己的/etc/hosts文件我的域名,這種方式很容易從本地傳遞到生產。

例子:

  • 生產網址是www.example.com
  • 發展網址爲www.lexample.com
+0

我更喜歡本地的'w3'子域名。 'w3.example.com'和'www.example.com' – guneysus 2014-12-24 12:18:47

3

我只是檢查httplib的(這大約是AppEngine上的包裝取出)

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

這似乎不適用於'testbed'本地單元測試。 – 2013-03-27 17:32:20

+0

我想指出,當App Engine內部時,'appengine'不再是'str(httplib.HTTP)'返回的字符串。實際的字符串是'gae_override.httplib.HTTP'。將測試更新到str(httplib.HTTP)中的'return'gae_override' – 2016-08-25 15:43:26

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

如果使用Mac系統,你可以寫一個更通用的代碼:

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

Django開發必須把這個示例代碼的文件settings.py在該項目。

編輯:
根據傑夫奧尼爾在macOS高塞拉利亞socket.gethostname()返回一個字符串以「.lan」結尾。

+0

對於最新的Mac OS X,正確的後綴現在似乎是「.lan」。 – 2017-11-14 14:24:05

+0

有趣的是,我只是在上週搬到Sierra,'socket.gethostname()'返回一個以「.local」結尾的字符串。 您正在運行High Sierra還是服務器版本的macOS? – ePi272314 2017-11-15 01:34:55

+0

我剛剛升級到高塞拉利昂,所以必須是。 – 2017-11-15 02:44:46

相關問題