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
参考:
2009/01/23
[GAE]Google App Engine を使ってみる Hello, webapp World!
前回は、単純な CGI を試してみましたが、今回は、Google App Engine に提供されている webapp というフレームワークを使ってみます。
Hello, webapp!
webapp は次の3つのパートからなります。
- リクエストの処理と、レスポンスを生成する、RequestHandler クラス
- URL に従ってリクエストをルーティングする、WSGIApplication インスタンス
- WSGIApplication を起動する、メインルーチン
さっそく、helloworld.py を書き換えてみます。
helloworld/helloworld.py
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
class MainPage(webapp.RequestHandler):
def get(self):
self.response.headers['Content-Type'] = 'text/plain'
self.response.out.write('Hello, webapp World!')
application = webapp.WSGIApplication(
[('/', MainPage)],
debug=True)
def main():
run_wsgi_app(application)
if __name__ == "__main__":
main()
開発サーバを起動し、http://localhost:8080 にアクセスします。
ブラウザに Hello, webapp World! が表示されれば成功です!
参考:
2009/01/22
[GAE]Google App Engine を使ってみる Hello, World!

昨年の4月にリリースされた、Google App Engine ですが、アカウントを申請したままずっと放置していました。
「一年の計は元旦にあり」ということで、今後ますますクラウド化していく世の中に備え、Google App Engine、Amazon Web Services は押さえておかなければなりません。
そこで、まずは Google App Engine を使ってみました。
使い始めるのは簡単で、
これですぐにローカルで開発が始められます。
Hello, World!
なにはともあれ、まずは Hello, World! ですね。
シンプルな Request Handler を作成
helloworld ディレクトリを作成し、その中に helloworld.py を作成します。
helloworld/helloworld.py
print 'Content-Type: text/plain'
print ''
print 'Hello, World!'設定ファイルを作成
helloworld ディレクトリに、app.yml を作成します。
helloworld/app.yml
application: helloworld
version: 1
runtime: python
api_version: 1
handlers:
- url: /.*
script: helloworld.pyアプリケーションのテスト
dev_appserver.py を実行し、ウェブサーバを起動します。実行するアプリケーションディレクトリのパスを渡します。
google_appengine/dev_appserver.py helloworld/開発サーバが起動したら、http://localhost:8080 にアクセスします。
ブラウザに Hello, World! が表示されれば成功です!
参考:

