2010-09-23 40 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

相关问题