Обновление данных в движке приложений Google

StackOverflow https://stackoverflow.com/questions/801477

  •  03-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь создать свой первый проект на движке приложений 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, чтобы позже при необходимости обновлять 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().

Что я должен делать?

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

Это было полезно?

Решение

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

Обратитесь к документации memcache здесь:

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

Другие советы

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

def post(self):
    # some code skipped

    self.shown_players = Player.all().fetch()
    for i, player in enumerate(self.shown_players):
      ...

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top