2009年7月14日火曜日

web.py をGoogle AppEngine上で動かす

pythonの練習がてらCRUD風のtodoリストを作成しました。

参考:
http://d.hatena.ne.jp/kinneko/20080409/p5
http://webpy.appspot.com/source
http://code.google.com/intl/ja/appengine/docs/python/datastore/creatinggettinganddeletingdata.html

main.py


import web
import datetime
from google.appengine.ext import db

urls = (
'/', 'index',
'/add', 'add',
'/update', 'update',
'/delete', 'delete',
)

render = web.template.render('templates/')


class Todo(db.Model):
body = db.StringProperty(required=True)
create_date = db.DateTimeProperty()
update_date = db.DateTimeProperty()

class index:
def GET(self):
todoes = Todo.all()
return render.index(todoes)

class add:
def POST(self):
i = web.input("body")
todo = Todo(body=i.body)
todo.create_date = datetime.datetime.now()
todo.update_date = datetime.datetime.now()
todo.put()
web.seeother("/")

class update:
def POST(self):
i = web.input()
todo = Todo.get(i.key)
todo.body = i.body
todo.update_date = datetime.datetime.now()
todo.put()
web.seeother("/")

class delete:
def POST(self):
i = web.input('key')
q = Todo.get(i.key)
#q = Todo.get('agl3ZWJweXRvZG9yCgsSBFRvZG8YBgw')
q.delete()
web.seeother("/")

if __name__ == '__main__':
app = web.application(urls, globals())
main = app.cgirun()


app.yaml

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

handlers:
- url: .*
script: main.py


こちらで動作確認できます。
http://webpytodo.appspot.com/

以下気づいたこと

・当然かもしれんが、web.pyのモジュールをappengineに含めないといけない。

・web.py 0.3ではcgirun()にappengine用のコードが含まれているので
アプリ側で特別な設定は必要ないみたい。

def cgirun(self, *middleware):
"""
Return a CGI handler. This is mostly useful with Google App Engine.
There you can just do:

main = app.cgirun()
"""
wsgiapp = self.wsgifunc(*middleware)

try:
from google.appengine.ext.webapp.util import run_wsgi_app
return run_wsgi_app(wsgiapp)
except ImportError:
# we're not running from within Google App Engine
return wsgiref.handlers.CGIHandler().run(wsgiapp)


・そのまま実行すると

render = web.template.render('templates/')

でエラーになるので、

python web/template.py --compile templates/

を実行して、appengine用に変換する必要があるらしい

http://webpy.org/cookbook/templates_on_gae

0 件のコメント: