Альтернатива синглтон? - PullRequest
       0

Альтернатива синглтон?

4 голосов
/ 17 ноября 2010

Я новичок в Python & App Engine (и на стороне сервера!), И я пытаюсь создать очень простую CMS. Каждое развертывание приложения будет иметь один и только один объект, созданный из чего-то вроде:

class Company(db.Model):
    name = db.StringPropery()
    profile = db.TextProperty()
    addr = db.TextProperty() 

Я пытаюсь предоставить средство для обновления профиля компании и других деталей.

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

Тогда я подумал, что, возможно, для каждого развертывания CMS я мог бы, как раз, запустить скрипт (запускаемый совершенно неясным URL), который просто создает экземпляр Company. С тех пор я бы получил этот экземпляр с theCompany = Company.all()[0]

Желательно ли это?

Тогда я вспомнил, что кто-то в этой теме предложил просто использовать модуль. Поэтому я просто создал файл Company.py и вставил в него несколько переменных. Я пробовал это в SDK, и, кажется, это работает - к моему удивлению, измененные значения переменных "выжили" между запросами.

Простите за мое невежество, но я предполагаю, что эти значения хранятся только в памяти, а не на дисках, в отличие от данных хранилища данных? Это надежное решение? (И будут ли переменные модуля находиться в области действия для всех вызовов сценариев моего приложения?)

Ответы [ 3 ]

2 голосов
/ 17 ноября 2010

Похоже, вы пытаетесь предоставить способ настройки приложения для каждого приложения.

Почему бы не использовать хранилище данных для хранения сущности вашей компании с именем_ключа? Тогда вы всегда будете знать, как получить сущность компании, и сможете редактировать компанию без ее повторного развертывания.

company = Company(key_name='c')
# set stuff on company....
company.put()

# later in code...
company = Company.get_by_key_name('c')

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

В дополнение к memcache вы можете использовать переменные модуля для кэширования значений. Они кэшируются , как вы видели, между запросами.

2 голосов
/ 17 ноября 2010

Глобальные переменные: " app-cached ."Это означает, что каждый конкретный экземпляр вашего приложения будет помнить значения этих переменных между запросами.Однако при отключении экземпляра эти значения будут потеряны.Поэтому я не думаю, что вы действительно хотите хранить эти значения в переменных уровня модуля (если они не являются константами, которые не нужно обновлять).

Я думаю, что ваше оригинальное решение будет работать нормально.Вы даже можете создать исходную сущность с помощью инструмента remote API , чтобы вам не требовалась скрытая страница для создания единственного и единственного Company объекта.

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

Если вам нужно будет часто извлекать эту сущность, то вы можете избежать обращений к хранилищу данных с помощью метода кэширования.Самым быстрым будет приложение-кешировать сущность Company после того, как вы извлечете ее из хранилища данных.Чтобы защитить объект от устаревания, вы также можете кэшировать в приложении время, когда вы последний раз извлекали объект, и если это время превышает N секунд, вы можете повторно извлечь его из хранилища данных.Для получения более подробной информации об этом параметре и его сравнении с альтернативами ознакомьтесь со статьей Ника Джонсона Параметры хранения в App Engine .

0 голосов
/ 17 ноября 2010

Я думаю, что вы читаете о простейшем подходе:

  • Используйте переменные модуля, инициализированные в None.
  • Предоставьте методы доступа (get / setters) для этих переменных.
  • При обращении к переменной, если ее значение равно None, получить ее из базы данных.В противном случае, просто используйте его.

Таким образом, у вас будут переменные для всего приложения, предоставляемые модулем (которые не будут создаваться снова и снова), они будут предоставлены, и вы выиграете 'потерять их.

...