判斷 App Engine 的 Session 是在 Online 或是 Development Server

(這個方法後來有變動,我之後寫一篇)

有時候我們可能因為在線上和 dev server 上面環境的不同,所以造成部分設定值有些差異,舉個例子好了:我用 App Engine 寫個 Facebook 應用程式,大家都知道 Facebook 應用程式的開發是鎖 domain URL 的,如果每次都要一直去改 domain 的設定,豈不是很麻煩?我原本是用這招:申請兩個 Facebook 應用程式,一個當做正式上線用,另一個則作為開發實驗用的 testbed,所以我就有兩組 app id, api key, app secret,只要切換這兩組我就不需要一直去改 Facebook 那邊的設定,不過每次 deploy 之前還必須要把這兩組變數的註解 toggle,也是有點麻煩。(而且要是不小心忘記就又要重新 deploy 一次,真麻煩!)

後來發現其實 Google 有提供一個 method 去檢視現在執行的程式是在 App Engine 上面還是 dev server 上,這隻 method 的位置在 google.appengine.api.conf 裡面,叫做 _inspect_environment(),這支函式的 spec 是這樣:(摘錄 Source 中的註解)

Return relevant information from the cgi environment.
This is mostly split out to simplify testing.
Returns:           
    A tuple: (app_version, conf_version, development)
    app_version: the major version of the current application.
    conf_version: the current configuration version.
    development: a boolean, True if we're running under devappserver.

所以回傳的其實是一個 3 個項目的 tuple,其中的第三項就是檢查是否在開發伺服器上的關鍵。
廢話不多說,舉個Facebook應用快速切換Key的範例:

from google.appengine.api import conf

# Get the status of the appengine running session

onDevServer = conf._inspect_environment()[2]

if onDevServer:
    # for testbed

    facebook_APP_ID = 'xxxx...'
    facebook_API_KEY = 'xxxx...'
    facebook_APP_SECRET = 'xxxx...'
else:
    # for publish

    facebook_APP_ID = 'xxxx...'
    facebook_API_KEY = 'xxxx...'
    facebook_APP_SECRET= 'xxxx...'

這樣系統就會根據上線以否來切換適合的 Facebook API keys 啦!

其實這個method的實作也很簡單,或許有很多人自己寫 function 來判斷伺服器是否上線,其實就只是把 Header 裡面 SERVER_SOFTWARE 這個變數拉出來看一下是不是以 "Development/" 這個字串開頭的而已。

SERVER_SOFTWARE 在上線的時候會是 "Google App Engine/1.5.0" 這樣的形式,而 dev server 上的話則是 "Development/1.0"(以目前來說,之後版本號的資訊可能會隨更新狀況跳動)

development = os.environ.get('SERVER_SOFTWARE', '').startswith('Development/') 
comments powered by Disqus