Question

J'essaie de lancer mon premier projet de moteur d'application Google & # 8211; une base de données de statistiques de joueur simple pour une équipe sportive avec laquelle je suis impliqué. Étant donné ce modèle:

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

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

Je souhaite créer une interface Web de base pour la création et la modification de lecteurs. Ma structure de code ressemble à ceci:

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

Ce code produit une page HTML très basique composée d'un formulaire et d'un tableau. La table a une ligne pour chaque joueur, ressemblant à ceci:

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

Mon idée est de stocker les instances de lecteur que j'ai utilisées dans self.shown_players afin de pouvoir ultérieurement mettre à jour les lecteurs si nécessaire dans ma méthode post () (de la même classe) par faire:

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

Toutefois, cela ne fonctionne pas car self.shown_players n'existe pas lorsque la méthode post () est appelée. Je suppose que le moteur de l’application crée une nouvelle instance de la classe à chaque accès à la page.

J'ai expérimenté la même idée mais en plaçant shown_players au niveau de la classe ou du module (et en l'appelant global ), mais cela n'a pas fonctionné pour des raisons impossibles à deviner. . Par exemple:

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 semble avoir la bonne valeur dans get () car le code HTML est généré correctement, mais vide dans post () .

Que dois-je faire?

EDIT: Merci à tous. La réponse ("Il suffit de récupérer les joueurs à nouveau!") Aurait dû être évidente :-) Je vais peut-être regarder Memcache un jour, mais je ne m'attends pas à ce que la liste des joueurs dépasse 30 dans un avenir proche.

Était-ce utile?

La solution

À chaque demande, vous travaillez sur une nouvelle instance de la même classe. C'est pourquoi vous ne pouvez pas créer de variable dans get () et utiliser sa valeur dans post () . Ce que vous pouvez faire est de récupérer à nouveau les valeurs dans votre méthode post () ou de stocker les données dans le memcache .

Reportez-vous à la documentation de memcache ici:

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

Autres conseils

Dans votre méthode de publication, juste avant le " pour " clause, récupérez la liste des joueurs à partir de laquelle elle est stockée:

def post(self):
    # some code skipped

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

Je n'ai jamais essayé de créer une application de moteur d'application Google, mais je comprends qu'elle est un peu similaire à Django dans le traitement des bases de données, etc.

Je ne pense pas que vous devriez stocker des éléments dans des variables globales, mais plutôt traiter chaque transaction séparément. La requête get fonctionne parce que vous faites ce que vous devriez faire et que vous redemandez les informations à la base de données.

Si vous souhaitez mettre à jour un joueur dans votre fonction de publication, vous souhaitez probablement transmettre les détails, [recherchez à nouveau les joueurs avec ces détails] , modifiez-les à votre guise. Le peu entre parenthèses est l’étape qui vous manque.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top