Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Google AppEngine(python)中存储配置的好地方是什么_Python_Google App Engine_Configuration Files - Fatal编程技术网

在Google AppEngine(python)中存储配置的好地方是什么

在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) 或者有一个稍微复杂一点的配置对象,它允许你为你的应用程序、名称空间的

我正在制作一个GoogleAppEngine应用程序,我怀疑我是否应该存储(敏感的)配置数据,比如凭证


我应该为配置创建一个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方法!!