Google App Engineでデータを更新する
-
03-07-2019 - |
質問
最初の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ページを生成します。テーブルには、各プレーヤーごとに1つの行があり、次のようになります。
<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()
メソッドで後でPlayersを更新できるようにすることです。実行:
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()
ただし、 post()
メソッドが呼び出されたときに self.shown_players
が存在しないため、これは機能しません。アプリエンジンは、ページにアクセスするたびにクラスの新しいインスタンスを作成すると思います。
同じアイデアで実験しましたが、クラスまたはモジュールレベルで 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
は、HTMLが正しく生成されるため get()
内で正しい値を持っているように見えますが、 post()
内では空です。
どうすればよいですか
編集:ありがとう、すべて。答え(「プレーヤーをもう一度検索してください!」)は明らかだったはずです:-)いつかmemcacheを見るかもしれませんが、近い将来にプレーヤーリストが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 App Engineアプリを作成したことはありませんが、データベースなどの処理がDjangoに似ていることは理解しています
グローバル変数に物事を保存するのではなく、各トランザクションを個別に処理する必要があるとは思わない。 getリクエストが機能するのは、本来すべきことを実行しており、dbからの情報を再リクエストしているからです。
投稿機能でプレーヤーを更新する場合は、詳細を渡し、 [これらの詳細を使用してプレーヤーを再度検索] 、必要に応じて変更します。括弧内のビットは、欠落しているステップです。