在Google AppEngine(python)中存储配置的好地方是什么
我正在制作一个GoogleAppEngine应用程序,我怀疑我是否应该存储(敏感的)配置数据,比如凭证在Google AppEngine(python)中存储配置的好地方是什么,python,google-app-engine,configuration-files,Python,Google App Engine,Configuration Files,我正在制作一个GoogleAppEngine应用程序,我怀疑我是否应该存储(敏感的)配置数据,比如凭证 我应该为配置创建一个bigtable实体,还是有其他建议的方法来存储它。将它们存储在模块中。您可以做得很简单,比如使用config.py模块,比如: AMAZON_KEY = 'XXXX' 然后使用: import config service = my_amazon_service(config.AMAZON_KEY) 或者有一个稍微复杂一点的配置对象,它允许你为你的应用程序、名称空间的
我应该为配置创建一个bigtable实体,还是有其他建议的方法来存储它。将它们存储在模块中。您可以做得很简单,比如使用
config.py
模块,比如:
AMAZON_KEY = 'XXXX'
然后使用:
import config
service = my_amazon_service(config.AMAZON_KEY)
或者有一个稍微复杂一点的配置对象,它允许你为你的应用程序、名称空间的配置键等设置合理的默认值。如果你愿意将它们嵌入到你的源代码中,你可以这样做,但如果你需要它是动态可配置的,那么数据存储就是最好的选择。通过将设置缓存在本地内存中,可以避免获取每个请求的设置。下面是一个帮助器类:
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
类配置(db.Model):
CACHE_TIME=datetime.timedelta(分钟=5)
_实例=无
_实例_年龄=无
@类方法
def get_实例(cls):
now=datetime.datetime.now()
如果不是cls.\U实例或cls.\U实例\U年龄+cls.CACHE\U时间<现在:
cls.\u INSTANCE=cls.get\u或\u insert('config'))
cls.\u实例\u年龄=现在
返回cls.\u实例
如果是敏感数据,则不应将其存储在源代码中,因为它将被签入源代码管理。错误的人(组织内部或外部)可能会在那里找到它。此外,开发环境可能使用与生产环境不同的配置值。如果这些值存储在代码中,您将不得不在开发和生产中运行不同的代码,这是一种混乱和糟糕的做法
在我的项目中,我使用以下类将配置数据放入数据存储:
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')
如果数据存储中有该键的值,您将得到它。如果没有,将创建占位符记录并引发异常。异常将提醒您转到开发人员控制台并更新占位符记录
我发现这样可以避免设置配置值时的猜测。如果您不确定要设置什么配置值,只需运行代码,它就会告诉您 @systempuntoot例如,我的Amazon AWS访问S3的凭据如果您不喜欢源代码中的普通凭据,唯一的方法是在数据存储上使用配置模型,否则您可以将设置存储在访问它的某个.ini文件中。请看:非常有趣,我以前从未见过这种技术。通常我会使用memcache来最小化从数据存储中获取的数量,但只要加载实例,这看起来就更快了。有没有内存限制可以防止过多地使用它?是的,有内存限制-尽管它们可能会改变。您可能不应该将实例内存用于通用缓存,但它非常适合配置数据。好的,谢谢,我会记住这一点。你有没有任何关于如何建立你所说的超时时间的建议?@Nick在这里看到一个快速而肮脏的超时时间会很酷。我第一次看到这种方法。@frank@systempuntoout通过演示更新了答案。做得好,效果很好,我还添加了一个set方法!!