Что хорошего места для хранения конфигурации в 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')
Если для этого ключа в хранилище данных есть значение, вы получите его. Если этого не произойдет, будет создана запись-заполнитель и будет выбрано исключение. Исключением будет напоминать, что вы заходите в Консоль разработчиков и обновляете запись заполнителя.
Я нахожу, что это угадывает установку значений конфигурации. Если вы не знаете, какие значения конфигурации заданы, просто запустите код, и он вам скажет!