今回はデータストア(Datastore)の使い方を紹介する。
データストアとは、言うなればGAEにおけるデータベースである。GAEアプリにおけるデータの永続化はこいつを使って行う。
早速ソースコードを書いてみよう。
お馴染みの helloworld.py を以下のように編集してみてくれ。
# -*- coding: utf-8 -*-
import cgi
from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext import db
class Greeting(db.Model):
author = db.UserProperty()
content = db.StringProperty(multiline=True)
date = db.DateTimeProperty(auto_now_add=True)
class MainPage(webapp.RequestHandler):
def get(self):
self.response.out.write('<html><body>')
greetings = db.GqlQuery("SELECT * FROM Greeting ORDER BY date DESC LIMIT 10")
for greeting in greetings:
if greeting.author:
self.response.out.write('<b>%s</b> wrote:' % greeting.author.nickname())
else:
self.response.out.write('An anonymous person wrote:')
self.response.out.write('<blockquote>%s</blockquote>' %
cgi.escape(greeting.content))
# Write the submission form and the footer of the page
self.response.out.write("""
<form action="/sign" method="post">
<div><textarea name="content" rows="3" cols="60"></textarea></div>
<div><input type="submit" value="Sign Guestbook"></div>
</form>
</body>
</html>""")
class Guestbook(webapp.RequestHandler):
def post(self):
greeting = Greeting()
if users.get_current_user():
greeting.author = users.get_current_user()
greeting.content = self.request.get('content')
greeting.put()
self.redirect('/')
application = webapp.WSGIApplication(
[('/', MainPage),
('/sign', Guestbook)],
debug=True)
def main():
run_wsgi_app(application)
if __name__ == "__main__":
main()
そして、いつものように開発用Webサーバを起動し、 http://localhost:8080 へアクセスしてみよう。
画面にはテキストエリアと「Sign Guestbook」ボタンが表示されていて、そこへ何か適当に入力すると、書き込みがどんどん追記されていくという、いわゆる掲示板アプリだ。
では、ソースコードを説明しようか。
まず、データモデリングAPI(データストアを利用するためのAPI)を使うためのモジュールをインポートする。
from google.appengine.ext import db
次に、このソースコードで定義されている三つのクラスに注目する。
一つ目のクラスは、Greetingクラスだ。こいつはdb.Modelというのを継承していて、データモデルを表している。
class Greeting(db.Model):
author = db.UserProperty()
content = db.StringProperty(multiline=True)
date = db.DateTimeProperty(auto_now_add=True)
このデータモデルでは、ユーザ情報オブジェクトとしてのauthor、文字列オブジェクトとしてのcontent、日付オブジェクトとしてのdate という三つのプロパティを宣言している。
contentプロパティは、multiline=Trueが設定されているため、改行も入力可能となっている。また、dateプロパティには、auto_now_add=Trueという設定がなされているため、入力が空の場合は自動的に現在日付(now)がセットされる。
二つ目のクラスは、MainPageクラスだ。このクラスは、データストアへアクセスして永続化されたデータを取得し、それらを画面へ表示する。重要なのは以下の部分だ。
greetings = db.GqlQuery("SELECT * FROM Greeting ORDER BY date DESC LIMIT 10")
db.GqlQueryメソッドにGQLというSQLに似たクエリ文字列を渡し、Greetingオブジェクトのリストを取得している。
これは以下の記述でも代用できる。
greetings = Greeting.gql("ORDER BY date DESC LIMIT 10")以下のようにしてパラメータを渡すことも出来る。以下は全て同じ意味だ。
greetings = Greeting.gql("WHERE author = :1 ORDER BY date DESC",
users.get_current_user()) greetings = Greeting.gql("WHERE author = :author ORDER BY date DESC",
author=users.get_current_user())greetings = Greeting.all()
greetings.filter("author =", users.get_current_user())
greetings.order("-date")
データストアに関してもっと詳しく知りたいならこちらを参照のこと。
三つ目のクラスは、Guestbookクラスだ。このクラスは「Sign Guestbook」ボタンが押されたときに、入力された内容をGreetingデータモデルへ格納し、データストアへ保存。最後に/へリダイレクトしている。重要な部分は以下である。
greeting = Greeting()
if users.get_current_user():
greeting.author = users.get_current_user()
greeting.content = self.request.get('content')
greeting.put()
greeting = Greeting()でGreetingデータモデルのインスタンスを生成し、そのauthorプロパティへGoogleインフラから取得したユーザ情報をセット、contentプロパティにはpost送信されてきた'content'データをセットし、最後にgreeting.put()でデータストアへ永続化している。
三つのクラスの説明は以上だ。
もう説明する必要もないと思うが、48-51行目ではURLと呼び出されるクラスを紐付けている。
ソースコードの説明は以上である。
GAE for Python のデータモデリングAPIはシンプルでいいね。
あ、一つだけ説明するのを忘れていた。
開発サーバーのデータストアをクリアする方法だ。
開発用Webサーバは、アプリをテストするために一時ファイルを使用したローカル用のデータストアを備えており、この一時ファイルが存在するうちはデータは永続化されている。これを開発用Webサーバ起動時に明示的に削除するには、--clear_datastore オプションを使用する。例えば、今回の helloworld アプリをデータストアを削除しつつ起動するには、以下のようにすればいい。
dev_appserver.py --clear_datastore helloworld/
さて、徐々に実用的なアプリ開発に近づいてきているわけだが、これまでのようにHTMLをソースコード内に書くのはどうもスマートではない。というわけで、次回はHTMLテンプレートを外部化する方法を説明する。
(続く)
ここはひとつポチっとよろしく。
プログラミング Google App Engine
posted with amazlet at 11.05.16
Dan Sanderson
オライリージャパン
売り上げランキング: 48590
オライリージャパン
売り上げランキング: 48590
【GAE for Pythonの最新記事】
- GAE/Pでmemcacheを利用してデ..
- PythonでJST日付をUTC(GMT..
- BeautifulSoupオブジェクトを..
- GAE/Pで詳細なエラーログ(トレース情..
- Pythonでオブジェクトのlistをソ..
- GAE/PでAspyctを使ってAOP(..
- GAE/Pでカスタムタグを作って日付をU..
- GAE/PでBeautifulSoupを..
- GAE/Pでログインが必要なページを取得..
- GAE/Pでファイルアップロード。
- GAE/Pでリクエストデータの扱い方。
- GAE/PでCRONを使ったスケジュール..
- GAE/PでModelをJSON変換する..
- GAE/P向け統合開発環境 Eclips..
- GAE/PとjQueryでJSONデータ..
- GAE+Pythonの標準モジュールだけ..
- GAE+Pythonでテンプレートの共通..
- GAEアプリをアップロードする方法。
- GAE+Pythonでテンプレートエンジ..
- webappフレームワークを使ったフォー..
