Frage

Ich versuche, mein erstes Google App Engine-Projekt - ein einfache Spielerstatistik-Datenbank für ein Sport-Team, das ich beteiligt bin. Vor diesem Modell:

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

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

Ich mag eine einfache Web-Schnittstelle zum Erstellen und Ändern Spieler machen. Meine Code-Struktur sieht wie folgt aus:

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

Dieser Code erzeugt eine sehr einfache HTML-Seite, bestehend aus einer Form und ein Tisch. Die Tabelle hat eine Zeile für jeden Spieler, die aussehen wie etwas wie folgt aus:

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

Meine Idee ist, dass ich die Player-Instanzen würde speichern, die ich in self.shown_players verwendet, so dass ich später Spieler bei Bedarf in meiner post() Methode (der gleichen Klasse) aktualisieren konnte, indem Sie:

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()

Dies ist jedoch nicht funktioniert, weil self.shown_players nicht existiert, wenn die post() Methode aufgerufen wird. Ich denke, die App Engine jedes Mal die Seite eine neue Instanz der Klasse erstellt zugegriffen wird.

experimentierte ich mit der gleichen Idee aber bei der Klasse oder Modulebene setzen shown_players (und nenne es global), aber das hat nicht funktioniert aus Gründen, die ich kann nicht göttlich. Zum Beispiel:

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 erscheint den richtigen Wert innerhalb get() zu haben, weil die HTML korrekt erzeugt, aber es ist leer innerhalb post().

Was soll ich tun?

EDIT: Danke, alles. Die Antwort ( „abrufen einfach die wieder Spieler!“) Liegt auf der Hand :-) gewesen sein Vielleicht an schaue ich werde memcache einen Tag, aber ich erwarte nicht die Spielerliste über 30 in naher Zukunft zu erhalten ..

War es hilfreich?

Lösung

Auf jede Anfrage Sie auf eine neue Instanz der gleichen Klasse arbeiten. Aus diesem Grund können Sie keine varable in get() erstellen und dessen Wert in post() verwenden. Was könnten Sie tun ist, entweder die Werte wieder in Ihrem post()-Methode abzurufen oder die Daten in der memcache speichern.

In der Dokumentation von memcache hier:

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

Andere Tipps

Ihre Post-Methode, kurz bevor die „für“ Klausel, rufen Sie die Spielerliste aus, wo sie gespeichert wird:

def post(self):
    # some code skipped

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

Ich habe nie versucht, ein Google App Engine App bauen, aber ich verstehe es darin Django etwas ähnlich ist die Verarbeitung von Datenbanken, etc.

Ich glaube nicht, sollten Sie die Dinge in globalen Variablen werden die Speicherung und stattdessen sollte jede Transaktion separat sein zu behandeln. Die get-Anfrage funktioniert, weil du tust, was Sie sollten tun, und erneut anfordert, die Informationen aus der db werden.

Wenn Sie einen Spieler in Ihrer Post-Funktion aktualisieren wollen, möchten Sie wahrscheinlich in den Details passieren, [nachschlagen Spieler mit diesen Details wieder] , ändern Sie sie als Sie bitte. Das Bit in Klammern ist der Schritt, Sie fehlt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top