2014-01-27 21 views
2

我正在閱讀有關使用YAML將設置存儲在GAE應用程序中的內容,我想我想這樣做。我正在談論我自己的常量,如API鍵和臨時變量,而不是像app.yaml這樣的標準GAE配置文件。Python和YAML-GAE應用程序設置文件

到目前爲止,我爲它使用了一個簡單的settings.py文件(其中包括用於生產/測試/ etc環境的單獨配置),但似乎沒有做好足夠的工作。

我甚至有一些嚴重的問題,當一個混帳合併覆蓋一些設置(很難控制它)。

最終我想盡可能多地在數據存儲中存儲數據,但現在我正在尋找想法。

那麼有沒有人有任何想法或例子,簡單的存儲和訪問,有時受保護,配置數據?

+0

我使用settings.yaml文件進行所有自己的設置。我自己並沒有遇到問題。我使用單獨的部分進行測試,產品等...因此每個部分都是獨立的。這樣我就不會交換/移動settings.yaml。 –

+0

我使用appengine_config:lib_config默認和掛鉤:https://developers.google.com/appengine/docs/python/tools/appengineconfig#Python_Module_Configuration – voscausa

回答

2

存儲的API密鑰和配置變量在靜態文件是通常總是一個壞主意,有幾個原因:

  • 努力更新:你需要以更新部署新的應用程序值
  • 不安全:你可能會提交到版本控制系統並沒有回來的路上
  • 不要放大:很多時候你必須爲不同的域

那麼,爲什麼不存儲直接從所有這些值不同的密鑰的安全十分開始在數據存儲,尤其是當它實際上是如此容易得多,這裏是如何:

所有你必須做的是爲您的配置值創建一個新模型,並且只有一條記錄。通過使用NDB,您可以開箱即用緩存,並且由於此配置文件的性質,您甚至可以對每個正在運行的實例進行緩存,以避免定期讀取數據存儲區。

class Config(ndb.Model): 
    analytics_id = ndb.StringProperty(default='') 
    brand_name = ndb.StringProperty(default='my-awesome-app') 
    facebook_app_id = ndb.StringProperty(default='') 
    facebook_app_secret = ndb.StringProperty(default='') 

    @classmethod 
    def get_master_db(cls): 
    return cls.get_or_insert('master') 

我也猜你已經有一個文件,最有可能被稱爲config.py,你有一些常量像這樣的:

PRODUCTION = os.environ.get('SERVER_SOFTWARE', '').startswith('Google App Engine') 
DEVELOPMENT = not PRODUCTION 

如果不創建一個或者你不只是內容添加到該文件還有:

import model # Your module that contains the models 

CONFIG_DB = model.Config.get_master_db() 

終於可以說,無論在您的應用程序(導入後閱讀,你可以簡單地做你的配置值當然):

config.CONFIG_DB.brand_name 

從現在起,你甚至不必創建任何特殊形式來更新這些值(建議雖然),因爲你可以從本地管理控制檯或儀表板在生產上。

請記住,如果您要將該記錄存儲在本地變量中,則必須在更新值後才能重新啓動instances以查看更改。


上述所有你可以在行動中看到它,我叫gae-init開源項目之一。

+0

這是一個很好的解決方案,但你如何保護自己不讓你的值改變錯誤? 另外,如果您進行本地更改,是否必須手動複製本地數據庫中的更改? – user2091046

+0

@ user2091046錯誤地更改值?以同樣的方式保護你自己,以任何其他方式錯誤地改變它們......通過限制誰可以將這些值更改爲最小值..對於本地值,可以使用默認值或通過提供參數' --storage_path'來避免重置本地數據庫.. – Lipis

+0

我需要以這種方式手動輸入生產中的配置數據嗎?我希望配置數據根據應用程序運行的環境(測試/產品)輕鬆切換 – user2091046

1

由於其他答案中列出的原因,您不應將配置值存儲在源代碼中。在我的最新項目,我把配置數據在數據存儲中使用這個類:

from google.appengine.ext import ndb 

class Settings(ndb.Model): 
    name = ndb.StringProperty() 
    value = ndb.StringProperty() 

    @staticmethod 
    def get(name): 
    NOT_SET_VALUE = "NOT SET" 
    retval = Settings.query(Settings.name == name).get() 
    if not retval: 
     retval = Settings() 
     retval.name = name 
     retval.value = NOT_SET_VALUE 
     retval.put() 
    if retval.value == NOT_SET_VALUE: 
     raise Exception(('Setting %s not found in the database. A placeholder ' + 
     'record has been created. Go to the Developers Console for your app ' + 
     'in App Engine, look up the Settings record with name=%s and enter ' + 
     'its value in that record\'s value field.') % (name, name)) 
    return retval.value 

你的應用程序將這樣做是爲了得到一個值:

AMAZON_KEY = Settings.get('AMAZON_KEY') 

如果在該鍵的值數據存儲,你會得到它。如果沒有,則會創建佔位符記錄並引發異常。該例外會提醒您轉到Developers Console並更新佔位符記錄。

我發現這需要猜測出設置配置值。如果您不確定要設置什麼配置值,只需運行代碼,它會告訴您!