2010-09-23 70 views
14

我正在製作一個Google AppEngine應用程序,並且懷疑我應該存儲(敏感)配置數據,例如憑據。什麼是在Google AppEngine中存儲配置的好地方(python)

我應該做一個單一的bigtable實體進行配置,還是有另一種建議的方式來存儲它。

+0

什麼樣的憑據? – systempuntoout 2010-09-23 10:34:53

+0

@systempuntoout例如我的亞馬遜AWS憑證用於訪問S3 – 2010-09-23 10:53:57

+0

如果您不喜歡源代碼中的普通憑據,唯一的方法是在數據存儲上使用配置模型,否則可以將設置存儲在某些.ini文件中使用[ConfigParser](http://docs.python.org/library/configparser.html)訪問它。 – systempuntoout 2010-09-23 12:38:42

回答

17

如果您可以將它們嵌入到源代碼中,那麼可以這樣做,但如果您需要它可以動態配置,那麼數據存儲就是要走的路。您可以避免通過在本地內存中緩存它們來獲取每個請求的設置。下面是一個輔助類:

class Configuration(db.Model): 
    _INSTANCE = None 

    @classmethod 
    def get_instance(cls): 
    if not cls._INSTANCE: 
     cls._INSTANCE = cls.get_or_insert('config') 
    return cls._INSTANCE 

只需使用任何你需要的配置值這個子類(或修改類本身)。因爲加載的代碼在請求之間持續存在,所以您只需對每個應用程序實例執行一次提取操作即可 - 但如果您希望能夠動態更新配置,則可能需要超時生成。

如果你要緩存的東西在有限的時間,最好的選擇是簡單地存儲時間戳,當你取來:

class Configuration(db.Model): 
    CACHE_TIME = datetime.timedelta(minutes=5) 

    _INSTANCE = None 
    _INSTANCE_AGE = None 

    @classmethod 
    def get_instance(cls): 
    now = datetime.datetime.now() 
    if not cls._INSTANCE or cls._INSTANCE_AGE + cls.CACHE_TIME < now: 
     cls._INSTANCE = cls.get_or_insert('config') 
     cls._INSTANCE_AGE = now 
    return cls._INSTANCE 
+0

非常有趣,我從來沒有見過這種技術。通常我會使用memcache來儘量減少數據存儲的提取次數,但只要實例被加載,這看起來會更快。任何內存限制,這將防止使用這太多? – Franck 2010-09-23 14:39:55

+0

是的,有內存限制 - 雖然它們可能會改變。您可能不應使用實例內存進行廣義緩存,但它對於配置數據非常理想。 – 2010-09-23 14:43:43

+1

好的,謝謝我會牢記這一點。你有沒有關於如何建立你所談論的超時的指針? – Franck 2010-09-23 14:48:27

10

將它們存儲在模塊中。你可以去簡單的,就像一個config.py模塊,說:

AMAZON_KEY = 'XXXX' 

然後使用:

import config 
service = my_amazon_service(config.AMAZON_KEY) 

還是有一個稍微複雜的配置對象,它可以讓你有你的應用程序合理的默認值,名稱空間配置鍵等。

4

如果是敏感數據,你應該不是在源代碼存儲,因爲它將被檢入源代碼管理。錯誤的人(在你的組織內部或外部)可能會在那裏找到它。另外,您的開發環境可能會使用生產環境中的不同配置值。如果這些值存儲在代碼中,那麼您將不得不在開發和生產中運行不同的代碼,這是一種混亂和糟糕的做法。

在我的項目,我把配置數據在數據存儲中使用這個類:

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並更新佔位符記錄。

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

+1

幹得好,作品像一個魅力,我還添加了一套方法! – 2016-06-19 20:47:50

相關問題