Как вы определяете конфигурационные переменные / константы в Google App Engine (Python)? - PullRequest
6 голосов
/ 26 августа 2010

Я новичок в python / GAE и мне интересно, как быстро определить и использовать переменные глобальных настроек, так что, скажем, вы клонируете мое приложение GAE и просто открываете config.yaml, добавляете изменения настроек, и приложение - всеВот так:

# config.yaml (or whatever)
settings:
  name: "Lance"
  domain: "http://example.com"

# main.py
class Main(webapp.RequestHandler):
  def get(self):
    logging.info(settings.name) #=> "Lance"

Какой основной способ сделать что-то подобное (я из Ruby)?

Ответы [ 2 ]

12 голосов
/ 26 августа 2010

Вы можете использовать любой модуль персистентности Python, вы не ограничены YAML.

Примеры: ConfigParser, PyYAML, синтаксический анализатор XML, такой как ElementTree, модуль настроек, используемый в Django ...

# ---------- settings.py

NAME = "Lance"
DOMAIN = "http://example.com"

# ---------- main.py

import settings

settings.DOMAIN # [...]

# ---------- settings.ini

[basic]
name = Lance
domain = http://example.com

# ---------- main.py

import ConfigParser

parser = ConfigParser.ConfigParser()
parser.read('setting.ini')

try:
    name = get('basic', 'name')
except (NoOptionError, NoSectionError):
    # no settings
1 голос
/ 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

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

DOMAIN = Settings.get('DOMAIN')

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...