データストアへのオブジェクトの保存

それではここでは簡単な掲示板を作っていきましょう。

掲示板

書き込みフォームが画面上部にあり、書き込まれたメッセージが画面の下部に並ぶ・・・という形式のシンプルなものです。メッセージはデータストアに保存します。

また、全体的な枠組みとしてはここでは webapp フレームワークを用いています。 用意したテンプレートは次の通りです。webapp やテンプレートがよく分からない、と言う人は webapp フレームワークのページを見直してみてください。

<html>
<body>
<h1>webapp Simple BBS</h1>
<form action="/" method="POST">
<table border="1">
<tr>
  <td>Name:</td>
  <td><input type="text" name="name" id="name"></td>
</tr>
<tr>
  <td>Email:</td>
  <td><input type="text" name="email" id="email"></td>
</tr>
<tr>
  <td>Message:</td>
  <td><textarea 
    name="msg" id="msg" 
    style="width:500px;height:75px;"></textarea></td>
</tr>
<tr>
  <td colspan="2"><input type="submit" value="Post Message"></td>
</tr>
</table>
</form>

<table border="1" style="width:100%;">
{% for message in messages %}
<tr>
  <td rowspan="2" valign="top" style="width:150px;">
    {{message.name|escape}}<br>
    <a href="mailto:{{message.email}}">{{message.email|escape}}</a>
    </td>
  <td>{{message.msg|escape}}</td>
</tr>
<tr>
  <td>Posted On {{message.postedon}}</td>
</tr>
{% endfor %}
</table>
</body>
</html>

さて、これを表示する単純な枠組みに対して、書き込みメッセージを表す Message クラスを定義すると、 次のようになります。

import os
import cgi
from datetime import date
from google.appengine.ext import webapp
from google.appengine.ext.webapp import template
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext import db

class Message(db.Model):
  name = db.StringProperty()
  email = db.StringProperty()
  msg = db.StringProperty(multiline=True)
  postedon = db.DateTimeProperty(auto_now_add=True)

class MyPage(webapp.RequestHandler):
  def get(self):
    messages = GQL を使ってデータを取得!
    template_values = {
      'messages': messages
    }
    path = os.path.join(os.path.dirname(__file__), 'index.html')
    self.response.out.write(template.render(path, template_values))

  def post(self):
    ここで POST されたデータを保存!    
    self.redirect('/')

application = webapp.WSGIApplication([('/', MyPage)], debug=True)

def main():
  run_wsgi_app(application)

if __name__ == "__main__":
  main() 

オブジェクトの取得、保存部分だけ抜いてありますが、そうすると、テンプレートを利用したときの最も単純なページ とほとんど変わらないことが分かります。

ではこの Message オブジェクトの保存部分を追加します。

場所は post メソッド内です。データを POST したときは、ここが呼び出されます。

オブジェクトを保存するには、オブジェクトを生成して、次のように put メソッドを呼び出すだけです。

  def post(self):
    message = Message()

    message.name = self.request.get('name')
    message.msg = self.request.get('msg')
    message.email = self.request.get('email')
    message.put()
    
    self.redirect('/')

put メソッドで保存した後、ここでは / へリダイレクトしています。 こうすると、get メソッドが呼び出されます。

では、引き続きオブジェクトを取得する場所を書いていきます。

» データストアに格納されたオブジェクトの取得