Как редактировать одну сущность в GAE (Python)? - PullRequest
2 голосов
/ 07 сентября 2011

Я делаю свой первый небольшой проект на Python (GAE), и нет проблем в работе с базой данных GAE с использованием запросов. Но когда дело доходит до редактирования одной сущности, у меня возникает проблема Все, что мне нужно, это простой счетчик, который будет увеличиваться при каждом посещении сайта. Итак, я создаю Entity (это делается один раз, просто для создания Entity, затем этот код удаляется из проекта):

counter_name = 'default_counter'

def counter_key(counter_n=None):
   return db.Key.from_path('Counter', counter_name)

class Counter(db.Model):
    amount = db.IntegerProperty()

class CounterClass(webapp.RequestHandler):
    def get(self):
        counter = Counter(counter_key(counter_name))
        counter.amount = 0
        counter.put()

Это нормально. Но когда я пытаюсь увеличить его, используя:

counter = db.get(db.Key.from_path('Counter', 'default_counter'))
counter.amount += 1
counter.put()

Я получаю эту ошибку.

ОШИБКА 2011-09-06 21: 49: 41,562 _webapp25.py:464] Объект 'NoneType' не имеет атрибута отслеживания количества (последний вызов был последним): файл "C: \ Program Files (X86) \ Google \ google_appengine \ Google \ AppEngine \ вн \ webapp_webapp25.py», линия 703, вызов Файл handler.post (* groups) "H: \ gae-bin \ counter.py", строка 48, в посте counter.amount + = 1 AttributeError: у объекта 'NoneType' нет атрибут «количество»

Я проверил различные варианты, но все еще не могу изменить значение сущности. Что я делаю не так?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 07 сентября 2011

Код, который вы используете для создания объекта Counter, скорее всего неверен.Он создает Counter сущность, у которой parent равен Counter с именем ключа, равным default_counter.Кажется, это не то, что вам нужно, о чем свидетельствует код, который вы используете для обновления счетчика.

Вам необходимо присвоить имя ключа вашей сущности Counter одним из следующих способов:

counter = Counter(key_name='default_counter')
# or
counter = Counter(key=db.Key.from_path('Counter', 'default_counter'))

Обратите внимание, что в общем случае иметь счетчик посещений - это плохая идея.У сущностей GAE есть ограничение на 5 обновлений в секунду, поэтому, если вы когда-либо масштабируете его сверх этого, вы столкнетесь с проблемами.

Обычный способ устранения ограничения обновлений заключается в использовании счетчиков шардинга какздесь описано: http://code.google.com/intl/pl/appengine/articles/sharding_counters.html.Комбинация хранилища данных и memcache также является опцией, если вы не возражаете, время от времени теряя некоторые приращения счетчика.

1 голос
/ 07 сентября 2011

Вы на самом деле не создаете сущность с этим ключом. Вы должны изменить это:

counter = Counter(db.Key.from_path('Counter', 'default_counter'))

к этому:

counter = Counter(key=db.Key.from_path('Counter', 'default_counter'))

И так как вы сразу устанавливаете сумму на 0, вы можете сделать это и при инициализации сущности:

counter = Counter(key=db.Key.from_path('Counter', 'default_counter'), amount=0)

Также обратите внимание , что это не очень хороший способ создания счетчика в App Engine. Вы захотите использовать такую ​​технику, как осколки счетчиков или что-то с использованием memcached

...