開発したアプリなど一覧

Google App Engine で作った時のメモ

先日 Google App Engine を使用して、2ちゃんねるぶろぐ という2chコピペブログを集めただけのwebサイトを作ったのだが、それの作成時のメモ。

最初から何も設定しなくても使える webapp を使ってます。

設定

設定ファイルは以下の3つ。yaml形式で書く。
app.yaml
cron.yaml
index.yaml

app.yaml

Python アプリケーション設定 - Google App Engine - Google Code

どのURLを叩かれた場合にどのような動作を行うかを書く。

基本的には以下のような感じ。

application: 2chblogs
version: 1
runtime: python
api_version: 1

# 静的なファイルを置く場合。
# ディレクトリの中にファイルを置いておけばdeployした時に勝手にアップロードされる。
- url: /image
  static_dir: image

# ファビコン
- url: /favicon.ico
  static_files: favicon.ico
  upload: favicon.ico

# 管理ページ memcacheとかdbとかの中身見れる。
# http://d.hatena.ne.jp/bellbind/20090716/1247757120
# login: admin と書いておけばアクセス時に認証が必要になる。
- url: /admin/.*
  script: $PYTHON_LIB/google/appengine/ext/admin
  login: admin

# 上記に当てはまらない場合はすべてmain.pyを叩く場合。
# ここで指定するのとmain.py内で指定するのはどう使い分けるべきなんですかね。
handlers:
- url: .*
  script: main.py

cron.yaml

Python 用の cron を使用したスケジュール タスク - Google App Engine - Google Code

cronで動かすものがある場合に必要。なくてもOK。

以下の例では20分置きに /getFeeds を実行。
schedule の指定は英文っぽい感じで、いわゆる cron とはまた別の形式。

cron:
- description: get feeds
  url: /getFeeds
  schedule: every 20 minutes

index.haml

しらん。

Python Datastore API

いわゆるリレーショナルデータベースの代わりに、データストアを使用する。

Model クラス - Google App Engine - Google Code

アプリケーションは、Model をサブクラスするクラスを定義することで、データ モデルを定義します。モデルのプロパティは、クラス属性と Property クラス インスタンスを使用して定義されます。次に例を示します。

以下のようにやればSQLでいうテーブルが作成できる。

from google.appengine.ext import db
class Entry(db.Model):
	title = db.StringProperty(required=True)
	link = db.LinkProperty(required=True)
	date = db.DateTimeProperty(required=True)
	summary = db.TextProperty()
	site_url = db.LinkProperty(required=True)
	site_title = db.StringProperty(required=True)

データの型に関しては以下のページにある。

型とプロパティ クラス - Google App Engine - Google Code

# データを挿入する。
_entry = Entry(title=title,
		link=link,
		summary=summary,
		date=_datetime,
		site_url=site_url,
		site_title=site_title)
_entry.put() # put() した時点でデータが入る。

# データを取得する。
# 全部取る場合。
ret = Entry.all()

# Where句を指定且つ一個だけ取得
ret = Entry.gql('WHERE link = :link', link='http://example.com/').fetch(limit=1)

# 並び替え。fetch は limit と offset を引数に与えれる。
ret = Entry.gql('order by date desc').fetch(20,30)

但し、一度に取得できるエントリ数は最大1000までの制限がある。offset で 1000以上を指定しても無駄とかどっかにあった気がする。

where や order by を行う代わりに、Query のインスタンスメソッドの filter() や order() を使用する事もできる。

詳しくは Query クラス - Google App Engine - Google Code を参照。

データの更新はやってないからパス。

webapp フレームワーク

webapp フレームワーク - Google App Engine - Google Code

webapp フレームワークはシンプルな Web アプリケーション フレームワークで、App Engine 向けの Python Web アプリケーション開発に使用できます。

だそうです。

kay とか Django とか使うのも良いのだけど、とりあえず最初なので webapp を使ってみた。

class get(webapp.RequestHandler):
	def get(self, num):
		hoge = self.request.get('hoge')
		# 途中省略
		self.response.out.write(contents)

# http://code.google.com/intl/ja/appengine/docs/python/tools/webapp/running.html
def main():
	application = webapp.WSGIApplication(
		[('/([0-9]*)', get),
		('/getFeeds', getFeeds),
		], debug=True)
	util.run_wsgi_app(application)

if __name__ == '__main__':
	main()

webapp.WSGIApplicationの一つ目の引数の書式は (URL, 実行するクラス) の形のタプル。
URL には正規表現を使用する事ができる。
get() にある num には webapp.WSGIApplication でグループに一致した値が入る。
もしくは、 self.request.get('hoge') で与えられたデータを取得できる。

データの取得方法については以下のページ

リクエスト データ - Google App Engine - Google Code

リクエストハンドラに使用できるメソッドは以下の7つ
get()
post()
head()
options()
put()
delete()
trace()

self.response.out.write(contents)
と書くと contents の中身を表示する。

今回は使ってないけど、リダイレクトとかヘッダーとかステータスコードを使用する場合は以下のページ

リダイレクト、ヘッダー、ステータス コード - Google App Engine - Google Code

テンプレート

webapp で使用できるテンプレートエンジンは Django のそれと同じ。

基本的なとこ

from google.appengine.ext.webapp import template
TEMPLATEDIR = os.path.dirname(__file__) + '/template/'

class hoge(webapp.RequestHandler):
	def get(self):
		template_values = {
				'message' : 'hoge'
				}
		path = TEMPLATEDIR +'hoge.html'
		contents = template.render(path, template_values)
		self.response.out.write(contents)

/template/hoge.html

<p>{{ message }}</p>

if と for

{% if countRanking %}
<div>
	<ul>
		{% for item in itemlist %}
		<li><a href="{{ item.url }}">{{ item.name }}</a></li>
		{% endfor %}
	</ul>
</div>
{% endif %}

block と 継承

hoge.html

<h1>{% block h1 %}ここにh1{% endblock %}</h1>

fuga.html

{% extends 'hoge.html' %}
{% block h1 %}ここの値が h1 に入る。{% endblock %}

Filter

一番下はカスタムフィルター。ちょっと前にブログに書いた。

GAE のテンプレートで Unicode 文字列を URLencode する。 - jkl.lomo.jp

{{ item.date|date:"M j, Y H:i:s" }}
{{ item.summary|striptags|slice:"128" }}
{{ item.title|unicode_urlencode }}

詳しくは Django のドキュメントを参考に。

Python プログラマのための Django テンプレート言語ガイド — Django v1.0 documentation


Django テンプレート言語 — Django v1.0 documentation

サービス

memcache と urlfetch しか使ってないのでそこだけメモ

memcache

from google.appengine.api import memcache

# 値をセットする。既に値が保存されていても上書きする。
memcache.set('hoge', hoge, time=3600)
# 値をセットする。既に値が保存されていたら上書きしない。
memcache.add('hoge', hoge, time=3600)
# 値を取得する。値が無ければ None を返す。
hoge = memcache.get('hoge')

ほかにもメソッドあるけど以下略

Memcache Python API - Google App Engine - Google Code

urlfetch

google app engine では外部と通信する場合は http もしくは https しか使えない様です。

from google.appengine.api import urlfetch
result = urlfetch.fetch(url)
if result.status_code is 200:
	hoge(result.content)

URL Fetch Python API - Google App Engine - Google Code

とりあえず自分のメモはこれで終了。

Google App Engine は結構簡単にwebアプリケーションが作れるのでおぬぬめ。

Sponsored Link

コメント