Что хорошего места для хранения конфигурации в Google AppEngine (python)

Я делаю приложение Google AppEngine и сомневаюсь, что следует хранить (конфиденциальные) данные конфигурации, такие как учетные данные.

Должен ли я создать единый объект bigtable для конфигурации, или есть другой способ его сохранить.

Ответы

Ответ 1

Если вы согласны с вложением их в свой источник, вы можете это сделать, но если вам нужно, чтобы он был динамически настраиваемым, хранилище данных - это путь. Вы можете избежать выборки настроек по каждому запросу путем их кеширования в локальной памяти. Здесь для этого вспомогательный класс:

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

Ответ 2

Храните их в модуле. Вы можете пойти просто, например, с модулем config.py с, скажем:

AMAZON_KEY = 'XXXX'

Затем используйте:

import config
service = my_amazon_service(config.AMAZON_KEY)

Или у вас есть несколько более сложный объект конфигурации, который позволяет иметь разумные значения по умолчанию для вашего приложения, именных конфигурационных ключей и т.д.

Ответ 3

Если это конфиденциальные данные, вы не должны хранить его в исходном коде, поскольку он будет проверен в исходном элементе управления. Неправильные люди (внутри или вне вашей организации) могут найти его там. Кроме того, среда разработки, вероятно, использует различные значения конфигурации из вашей рабочей среды. Если эти значения хранятся в коде, вам придется запускать разный код в процессе разработки и производства, что является грязной и плохой практикой.

В моих проектах я помещал данные конфигурации в хранилище данных, используя этот класс:

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\ value field.') % (name, name))
    return retval.value

Ваше приложение будет делать это, чтобы получить значение:

AMAZON_KEY = Settings.get('AMAZON_KEY')

Если для этого ключа в хранилище данных есть значение, вы получите его. Если этого не произойдет, будет создана запись-заполнитель и будет выбрано исключение. Исключением будет напоминать, что вы заходите в Консоль разработчиков и обновляете запись заполнителя.

Я нахожу, что это угадывает установку значений конфигурации. Если вы не знаете, какие значения конфигурации заданы, просто запустите код, и он вам скажет!