2011年6月4日 星期六

判斷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 keys啦!

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

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

Source:

    development = os.environ.get('SERVER_SOFTWARE', '').startswith('Development/')

沒有留言:

張貼留言