Google App Engine 一人勉強会 第一回 とりあえず動かしてみる

目標とサンプルとソース置き場

目標は Google App Engine 上で動くアプリを作り上げることです。

サンプル

ソース

第一回 とりあえず動かしてみる

id:perezvonid:mopemope が触っている Werkzeug を使って Google App Engine のアプリを書いています。多分ですが Werkzeug はオレオレフレームワークを作るための道具です。

Google App Engine(GAE) は WSGI で動いているので WSGI Tools の Werkzeug は問題なく動くので、Django を頑張って動かすのは皆さんにお任せして、WSGI の勉強ついでに遊んでみています。

ファイル構成は Django とほとんど変わりません。

  • main.py ... 起動するだけ
  • app.py ... WSGI Application
  • views.py
  • models.py
  • urls.py

Werkzeug を使ったメリットとしてローカルの開発において、Werkzeug のデバッガが使えます。わかる人にはわかると思いますが、これ意外にメリットとしては大きいです。リンクだけ紹介しておきます。載せたコードからはこの部分を省略しています(わかりにくいので)

テンプレートには jinja2 を使用予定でしたが、とりあえず使わないバージョンで公開します。使ったバージョンはまた別途。

main.py

from wsgiref.handlers import CGIHandler

from app import Application

def main():
  application = Application()
  CGIHandler().run(application)

if __name__ == '__main__':
  main()

app.py

from werkzeug import Request
from werkzeug.exceptions import HTTPException, InternalServerError

import views
from urls import url_map

class Application(object):
  def __call__(self, environ, start_response):
    request = Request(environ)
    adapter = url_map.bind_to_environ(environ)
    try:
      endpoint, values = adapter.match()
      handler = getattr(views, endpoint)
      response = handler(request, **values)
    except HTTPException, e:
      response = e
    except:
      response = InternalServerError()
    return response(environ, start_response)

views.py

from werkzeug import Response, escape

def index(reqest):
  return Response(u'''<h1>Index Page</h1>
  <p>What\'s your name?</p>
  <form action="hello" method="post">
      <input type="text" name="name" value="My Name">
      <input type="submit" value="Greet Me!">
  </form>
  ''', mimetype='text/html')

def hello(request):
  name = request.form.get('name') or 'Nobody'
  return Response(u'<h1>Hello %s!</h1>' % escape(name),
                  mimetype='text/html')

def about(request):
  return Response(u'''<h1>About This Page</h1>
      <p>This page is just a small example page for Werkzeug</p>
  ''', mimetype='text/html')

def not_found(request):
  return Response(u'<h1>Page Not Found</h1>', status=404, mimetype='text/html')

urls.py

from werkzeug.routing import Map, Rule

url_map = Map([
  Rule('/', endpoint='index'),
  Rule('/hello', endpoint='hello'),
  Rule('/about', endpoint='about')
])

Django を経験している人なら何も気にすること無く、触れると思います。