Google App Engine のチュートリアルを元にデータストア機能を試してみた。非常に簡単で分かりやすい。まだ、ソースコードの中にhtmlを記述しているような状態なので、テンプレートの利用やCSSの修飾を試してみよう。
下の画面は開発環境での実行画面。まだデータの更新・削除、上位の分類、写真との連携をなど検討事項は多いがボチボチと機能を追加していこう。
#!/usr/bin/env python
#
# Copyright OpenCage.
#
# Taxonomy datastore.
#
import wsgiref.handlers
import cgi
import datetime
from google.appengine.ext import webapp
from google.appengine.ext import db
class Taxonomy(db.Model):
genus = db.StringProperty()
species = db.StringProperty()
authar = db.StringProperty()
jpname = db.StringProperty()
date = db.DateTimeProperty(auto_now_add=True)
class MainHandler(webapp.RequestHandler):
# taxon を Taxoクラスに post してデータを保存。
def get(self):
self.response.out.write("""
<html>
<head>
<title>Taxonomy Datastore</title>
</head>
<body>
<form method='post' action='/taxo'>
<input name='genus' type='text' value='genus' />
<input name='species' type='text' value='species' />
<input name='authar' type='text' value='authar' />
<input name='jpname' type='text' value='jpname' />
<input name='submit' type='submit' value='Store this' />
</form>""")
# データの取り出し
taxolist = db.GqlQuery("SELECT * "
"FROM Taxonomy "
"ORDER BY genus, species")
for taxonomy in taxolist:
spname = str(taxonomy.genus) + " " + str(taxonomy.species)
# カラムの値を効率的に連結する方法がまだ分からないので、
# チュートリアルと同じことを3回繰り返して、一行を生成。
self.response.out.write('<p><i lang="ra">%s</i>' %
cgi.escape(spname)
)
self.response.out.write(' <small>%s</small>' %
cgi.escape(taxonomy.authar)
)
self.response.out.write(' <span lang="ja">%s</span></p>' %
cgi.escape(taxonomy.jpname)
)
self.response.out.write("""
</body>
</html>
""")
# MainHandler クラスから post されたデータを保存
class Taxo(webapp.RequestHandler):
def post(self):
taxonomy = Taxonomy()
taxonomy.genus = self.request.get('genus')
taxonomy.species = self.request.get('species')
taxonomy.authar = self.request.get('authar')
taxonomy.jpname = self.request.get('jpname')
taxonomy.put()
self.redirect('/')
# class を URI に変換
application = webapp.WSGIApplication([
('/', MainHandler),
('/taxo', Taxo)
], debug=True)
def main():
wsgiref.handlers.CGIHandler().run(application)
if __name__ == '__main__':
main()
</code>
0 件のコメント:
コメントを投稿