2009/09/07
Google App Engine Oil で twitter もどき STEP 1
前回、Webアプリケーションをさくっと手軽に構築できてしまう Google App Engine (GAE) を試してみましたが、今回は、もう少しまともなアプリケーションを作ってみます。
作成する前に、つい先日 GAEO が 0.3 にバージョンアップしているようなので、早速最新のリリースを試してみましょう。
バージョンアップ作業は、環境変数のパスを新しいバージョンのものに変更しただけです。
Twitter は、140文字以下の短いメッセージをつぶやきあうシンプルなサービスです。現在とても注目されているサービスですね。
シンプルでわかりやすいですので、今回は Twitter もどきのアプリケーションを作成してみます。
mockker
それでは、Twitter もどきの「mockker」というプロジェクトを作成します。
とりえあず今回は、データの登録ができればOKとします。また、アカウントは Google App Engine の ユーザーサービスを使用し、Google アカウントと連携させます。
gaeo.py mockker
cd mockker
まずは、つぶやきの scaffold を作成します。
gaeogen.py scaffold status create show "text:StringProperty()" "user:UserProperty()" "created_at:DateTimeProperty(auto_now_add=True)"
ルーティング
デフォルトのルートへのルーティングを、welcome/index から status/index へ変更します。
gaeo/dispatch/router.pyclass Router:
""" Handles the url routing... """
class __impl:
def __init__(self):
self.__routing_root = {'controller': 'status',
'action': 'index'}
model
scaffold により、 application/model/status.py が作成されます。
application/model/status.pfrom google.appengine.ext import db
from gaeo.model import BaseModel, SearchableBaseModel
class Status(BaseModel):
created_at = db.DateTimeProperty(auto_now_add=True)
text = db.StringProperty()
user = db.UserProperty()
controller
scaffold により作成された status コントローラを次のように修正します。
application/controller/status.pyimport cgi
import logging
from google.appengine.ext import db
from google.appengine.api import users
from gaeo.controller import BaseController
from model.status import Status
class StatusController(BaseController):
def create(self):
r = Status(
# Uncomment all required properties here.
# text = self.params.get('text', None),
# created_at = self.params.get('created_at', None),
user = users.get_current_user(),
)
for prop in Status.properties():
if prop in self.params:
setattr(r, prop, self.params.get(prop))
r.put()
self.flash['notice'] = u"独り言を更新したよ"
self.redirect('/')
def index(self):
notice = self.flash.get('notice', '')
self.msg = notice
if self.current_user:
query = Status.all().filter('user = ', self.current_user)
query.order("-created_at")
self.result = query.fetch(limit=10)
def show(self):
r = Status.get(self.params.get('id'))
if r:
for prop in Status.properties():
setattr(self, prop, getattr(r, prop))
else:
self.redirect('/')
ユーザー認証のため、base コントローラの before_action を次のように修正します。
これにより、全てのアクションの前にユーザー認証が実行されます。
from google.appengine.api import users
def before_action(self):
self.current_user = users.get_current_user()
if not self.current_user:
self.signed_in = False
self.login_url = users.create_login_url(self.request.uri)
#self.redirect(users.create_login_url(self.request.uri))
else:
self.signed_in = True
self.logout_url = users.create_logout_url(self.request.uri)
self.nickname = self.current_user.nickname()
view
view を次のように修正します。
application/templates/base.html<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>{% block title %}{% endblock %}</title>
<link rel="stylesheet" href="/css/common.css" type="text/css" media="screen" />
{% if signed_in %}
<link rel="stylesheet" href="/css/login.css" type="text/css" media="screen" />
{% endif %}
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script type="text/javascript" src="/js/application.js"></script>
</head>
<body>
<div id="header">
<div id="header_inner">
<h3><a href="/" title="Mockker">Mockker</a></h3>
{% if signed_in %}
<ul id="nav">
<li><a href="{{ logout_url }}" title="Logout">Logout</a></li>
</ul>
{% else %}
<ul id="nav">
<li><a href="{{ login_url }}" title="Login">Login</a></li>
</ul>
{% endif %}
</div>
</div>
<div id="content">
<div id="content_inner">
{% if msg %}
<div class="flash">
<div class="notice">
<p>{{ msg }}</p>
</div>
</div>
{% endif %}
{% if signed_in %}
<div id="update">
<form method="post" action="/status/create">
<span id="countdown">140</span>
<label for="text">何か言いたいことは?</label>
<textarea id="text" name="text" rows="10" cols="10"></textarea>
<input type="submit" name="update" value="Update" />
</form>
</div>
{% endif %}
{% block content %}{% endblock %}
</div>
</div>
<div id="footer">
<div id="footer_inner">
<div class="column">
<ul>
<li><a href="/" title="Home">Home</a></li>
</ul>
</div>
</div>
</div>
</body>
</html>
application/templates/status/index.html
{% extends "../base.html" %}
{% block title %}StatusController#index{% endblock %}
{% block content %}
<div id="statuses">
{% for r in result %}
<div id="status_{{ r.key }}" class="status">
<div class="info">
<p class="who_when">
{{ r.user.nickname }}<br />
{{ r.created_at }}
</p>
<p class="actions">
</p>
</div>
<div class="text">
{{ r.text }}
</div>
</div>
{% endfor %}
</div>
{% endblock %}
あとは、Javascript や CSS などで、見栄えを整えます。
実行
dev_appserver.py .
登録したデータをクリアしたい場合は、「--clear_datastore」オプションをつけて実行します。
dev_appserver.py --clear_datastore .
以上で、自分だけがつぶやくことができる、独り言アプリケーションの完成ですw
次回は、他人のつぶやきを表示できるようにしてみたいと思います。
2009/08/04
Google App Engine Oil
Webアプリケーションをさくっと手軽に構築できてしまう Google App Engine (GAE) ですが、この Google 製のエンジンに、あるオイルを入れてやると、さらに激速なマシンができるようです。
Google App Engine Oil(GAEO) というこのオイルは、Ruby on Rails を参考にして作られた App Engine 専用の レーシングスペックのエンジンオイル(Webアプリケーションフレームワーク)です。
GAEO をインストール
まず、GAEO は GAE 上で実行されますので、予め Python や、GAE SDK をインストールします。
なお、以下は Windows での解説です。
プロジェクトホーム からパッケージ(gaeo-0.2.1.zip など)をダウンロードし、好きなところに解凍します。
GAEO スクリプトを利用するために、解凍先の bin ディレクトリへのパスを、環境変数 PATH に追加します。
パスを設定しましたら、gaeo.py コマンドを実行し、下記のようになるとインストール完了です。
>gaeo.py
Usage: C:\<install dir>\bin\gaeo.py <project name>
Hello GAEO
では、早速 Hello GAEOプロジェクトを作ってみます
GAEO でのプロジェクトを作成するには、作業ディレクトリで、次のコマンドを実行します。
gaeo.py hello
hello プロジェクトを作成すると、hello ディレクトリには、下記のコンテンツが生成されます。Rails そっくりです。
- app.yaml, favicon.ico, main.py
app.yaml と main.py は、GAE のメイン設定ファイルです。
- application/
アプリケーションのコードの置き場所。基本的にこの中のファイルを編集していきます。
- assets/
javascript や css ファイルの置き場所。app.yaml で設定可能です。
- gaeo/
GAEO のコアライブラリ。GAEO のアップグレードは、このディレクトリのファイルを入れ替えるとOKです。
- plugins/
プラグインのインストールディレクトリです。
アプリケーションの起動と確認
次のコマンドで GAE を起動し、作成したアプリケーションの動作を確認します。
なお、コマンドはアプリケーションのルートディレクトリで実行します。
hello>dev_appserver.py .
Running application hello on port 8080: http://localhost:8080
http://localhost:8080/ にアクセスして、「It works!!」と表示されればOKです。
なかなか刺激的な体験ですが、次はちょっとしたアプリケーションを作ってみたいと思います。
- Google App Engine Oil で twitter もどき
- Google App Engine Oil で twitter もどき STEP 1
参考:

