Обновление данных в Google App Engine - PullRequest
0 голосов
/ 29 апреля 2009

Я пытаюсь создать свой первый проект движка приложения для Google - простую базу данных об игроке для спортивной команды, с которой я работаю. Учитывая эту модель:

class Player(db.Model):
    """ Represents a player in the club. """

    first_name = db.StringProperty()
    surname = db.StringProperty()
    gender = db.StringProperty()

Я хочу сделать базовый веб-интерфейс для создания и модификации плееров. Моя структура кода выглядит примерно так:

class PlayersPage(webapp.RequestHandler):
    def get(self):
        # Get all the current players, and store the list.
        # We need to store the list so that we can update
        # if necessary in post().
        self.shown_players = list(Player.all())

        # omitted: html-building using django template

Этот код создает очень простую HTML-страницу, состоящую из формы и таблицы. В таблице есть по одной строке для каждого игрока, которая выглядит примерно так:

  <tr>
    <td><input type=text name="first_name0" value="Test"></td>
    <td><input type=text name="surname0" value="Guy"></td>
    <td><select name="gender0">
        <option value="Male" selected>Male</option>
        <option value="Female" >Female</option>
      </select></td>
  </tr>
  <!-- next row: first_name1, etc. -->

Моя идея заключается в том, что я буду хранить экземпляры Player, которые я использовал, в self.shown_players, чтобы впоследствии я мог обновить игроков, если это необходимо, в моем методе post() (того же класса), выполнив:

def post(self):
    # some code skipped

    for i, player in enumerate(self.shown_players):
        fn = self.request.get('first_name'+str(i)).strip()
        sn = self.request.get('surname'+str(i)).strip()
        gd = self.request.get('gender'+str(i)).strip()
        if any([fn != player.first_name,
                sn != player.surname,
                gd != player.gender]):
            player.first_name = fn
            player.surname = sn
            player.gender = gd
            player.put()

Однако это не работает, потому что self.shown_players не существует, когда вызывается метод post(). Я предполагаю, что движок приложения создает новый экземпляр класса каждый раз, когда к странице обращаются.

Я экспериментировал с той же идеей, но поместил shown_players на уровне класса или модуля (и назвал его global), но это не сработало по причинам, которые я не могу угадать. Например:

shown_players = []
class PlayersPage(webapp.RequestHandler):
    def get(self):
        # Get all the current players, and store the list.
        # We need to store the list so that we can update
        # if necessary in post().
        global shown_players
        shown_players[:] = list(Player.all())

shown_players имеет правильное значение в get(), потому что HTML генерируется правильно, но оно пустое в post().

Что мне делать?

РЕДАКТИРОВАТЬ: Спасибо, все. Ответ («Просто верните игроков снова!») Должен был быть очевидным :-) Возможно, однажды я посмотрю на memcache, но я не ожидаю, что список игроков выйдет за пределы 30 в ближайшем будущем ..

Ответы [ 3 ]

2 голосов
/ 29 апреля 2009

В вашем методе post, перед предложением «for», получите список игроков, где он хранится:

def post(self):
    # some code skipped

    self.shown_players = Player.all().fetch()
    for i, player in enumerate(self.shown_players):
      ...
2 голосов
/ 29 апреля 2009

По каждому запросу вы работаете с новым экземпляром того же класса. Вот почему вы не можете создать varable в get() и использовать его значение в post(). Что вы можете сделать, это либо получить значения снова в post() -методе, либо сохранить данные в memcache.

См. Документацию к memcache здесь:

http://code.google.com/intl/de-DE/appengine/docs/python/memcache/

1 голос
/ 29 апреля 2009

Я никогда не пытался создать приложение google app engine, но я понимаю, что оно несколько похоже на Django в обработке баз данных и т. Д.

Я не думаю, что вы должны хранить вещи в глобальных переменных, а вместо этого должны обрабатывать каждую транзакцию отдельно. Запрос get работает, потому что вы делаете то, что должны делать, и повторно запрашиваете информацию из базы данных.

Если вы хотите обновить игрока в своей функции поста, вы, вероятно, хотите передать детали, [ищите игроков с этими деталями еще раз] , измените их, как вам угодно. Бит в скобках - это шаг, который вам не хватает.

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