在Google应用引擎中更新数据

时间:2009-04-29 08:47:56

标签: python google-app-engine

我正在尝试我的第一个谷歌应用引擎项目 - 一个简单的玩家统计数据库,供我参与的运动队使用。鉴于此模型:

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

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

我想创建一个用于创建和修改玩家的基本Web界面。我的代码结构如下所示:

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. -->

我的想法是,我会存储我在self.shown_players中使用的Player实例,这样我以后可以通过以下方式在我的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 个答案:

答案 0 :(得分:2)

在每个请求中,您正在处理同一个类的新实例。这就是为什么你不能在get()中创建一个varable并在post()中使用它的值。您可以做的是在post() - 方法中再次检索值,或将数据存储在memcache

请参阅此处的memcache文档:

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

答案 1 :(得分:2)

在你的post方法中,就在“for”子句之前,从它存储的位置检索播放器列表:

def post(self):
    # some code skipped

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

答案 2 :(得分:1)

我从未尝试构建谷歌应用引擎应用,但据我所知,它在处理数据库等方面与Django有些类似。

我认为你不应该将事物存储在全局变量中,而应该单独处理每个事务。 get请求有效,因为您正在做您应该做的事情并从db重新请求信息。

如果您想要更新帖子功能中的播放器,您可能想要传递详细信息, [再次查看具有这些详细信息的播放器] ,并根据需要进行修改。括号中的位是您缺少的步骤。