Что такое хорошее место для хранения конфигурации в Google AppEngine (python) - PullRequest
14 голосов
/ 23 сентября 2010

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

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

Ответы [ 3 ]

18 голосов
/ 23 сентября 2010

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

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
10 голосов
/ 23 сентября 2010

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

AMAZON_KEY = 'XXXX'

Тогда используйте:

import config
service = my_amazon_service(config.AMAZON_KEY)

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

4 голосов
/ 08 февраля 2016

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

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

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')

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

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

...