Можно ли обновить запись в хранилище данных Google App Engine через словарь объекта? - PullRequest
0 голосов
/ 09 августа 2009

Я попробовал следующий код, и он не работал:

class SourceUpdate(webapp.RequestHandler):
  def post(self):
    id = int(self.request.get('id'))
    source = Source.get_by_id(id)
    for property in self.request.arguments():
      if property != 'id':
        source.__dict__[property] = self.request.get(property)
    source.put()
    self.redirect('/source')

Я публикую все необходимые свойства, но запись не обновляется, и ошибка не отображается.Как это исправить?

BTW

class Source(db.Model):
  #some string properties

Ответы [ 2 ]

2 голосов
/ 10 августа 2009

Вместо того, чтобы напрямую устанавливать значения модели из запроса, вы можете изучить использование форм Django. Они поставляются в комплекте с App Engine и облегчают проверку данных формы и ее сохранение в хранилище данных, а также генерирование формы HTML. Здесь есть статья о том, как использовать их с хранилищем данных App Engine здесь .

Кроме того, не забывайте, что внесение изменений на основе запроса GET почти всегда является плохой идеей и приводит к уязвимостям XSRF и другим проблемам!

2 голосов
/ 09 августа 2009

Вы игнорируете функциональность, подобную __setattr__, которую метакласс моделей (type(type(source))) обычно использует для правильной работы с настройкой атрибутов. Измените свой внутренний цикл на:

for property in self.request.arguments():
  if property != 'id':
    setattr(source, property, self.request.get(property))

и все должно работать (если все типы свойств могут быть правильно установлены из строки, так как это то, что вы получите от request.get).

...