カテゴリー: GoogleAppEngine

チュートリアルその2:「Using the webapp Framework」

今日もGoogle App Engine のチュートリアルを進めます。

前回と同様にEclipse上からPyDev Google App Engine Projectで新規プロジェクトを作成。今回はテンプレートとして「Hello Webapp World」を選択しました。もしや…と思いましたが、今回もチュートリアルとそっくりそのままなソースファイルが生成されました。

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()

ここで、webappとはウェブアプリケーションのフレームワーク(ブラウザ←→ウェブサーバやデータベース間の仲介役)のひとつなわけですよね。で、Google App Engine は多くのウェブアプリケーションフレームワーク(Pythonで書かれたもののみ?DjangoやCherryPyなど)に対応しているとのこと。webappもそのひとつ。

前回同様に実行環境を起動して、ブラウザからアクセスしたことろ、”Hello, webapp World!”と表示されました。

どのように動いているか

このソースがどうする順に動いているのかは、以下のようになるのかな、と理解しました。この辺、Python初心者(というよりもウェブアプリ初心者かな)のためにたぶん誤解があると思うので、そのあたりはご容赦ください。

  • Eclipse上でhelloworld.pyを実行する
    • 実行環境(dev_appserver.py経由)が稼動する
    • そこからmain()が呼ばれる
    • run_wsgi_app()が呼ばれる時にapplicationがインスタンス化され、URLとマッピング先クラスとのマッピングの準備が出来る
  • ブラウザから実行環境(=http://localhost:8080/)にアクセスする
    • applicationにブラウザからのリクエストが届き、URLを見てマッピング先(であるMainPage)をインスタンス化
    • MainPageのgetメソッドが起動され、responseプロパティを編集してブラウザにそれが返される

うーん、自分で書いててもあいまいな部分があると感じます。こうしたことを考えるときに、すべての事柄に対して主語と述語と目的語が適切に埋められないという時点で、要は「理解が足りない」ということですよね。ま、これからこれから。

また、WSGI(Web Server Gateway Interface)に関する現時点での理解ですが、ちょっと先行して参照した『みんなのPython Webアプリ編 [みんなのシリーズ]』の308ページに、

「WSGIとは」Pythonで作るWebアプリケーションの実装方法の標準化仕様です。(中略)WSGIの手法を活用してWebアプリケーションを構成する部品を実装することで、アプリケーションの再利用性を高めることができるのです。

とあるとおり、Pythonにおけるwebアプリ作成時の「お作法」なわけですね。で、webappやDjangoはこれに準拠していると。こうしたことにはおとなしく従ってみることにしましょう。

ということは、今回のチュートリアルは、前回のチュートリアルと同じ結果を得るために、このWSGIの作法に従ってwebappを用いて行うとこうなるね、ということなのでしょう。

今日はここまでです。次回は「Using the Users Service」、ユーザー管理のサンプルが見られるかな?

広告

チュートリアルその1:「Hello, World!」

まずはやっぱり万国共通のチュートリアル、Hello Worldですね。

チュートリアル上では特にEclipse上で開発することへの言及はないですが、なるべくEclipse上で行います。

まずは、Eclipse上でプロジェクトを作成。「PyDev Google App Engine Project」というのが選べるので、これにしましょう。プロジェクト名はもちろん”helloworld”。Grammar Versionは2.5を選びます。

次に、Google App Engine Directoryを選べ、と言われますので、画面から「C:\Program Files\Google\google_appengine」を指定。

すると次はapplication idと、プロジェクトの元となるテンプレートを選べ、ときました。application idは、所詮ローカルでのテストなのでそのまま”helloworld”に、テンプレートはいくつか選べますが、これも一番シンプルなものであろう「Hello World」を選択。おそらくまだwebappは使わないでしょうし。

これで、helloworldという名前のプロジェクトフォルダ(アイコンは普通のPyDev Projectと同じもの)が作られ、なかにsrcフォルダもあり、そのなかにapp.yamlとhelloworld.pyの2つのファイルが作成されました。ここで作られるファイルとその構成は、おそらく一つ前で選択するテンプレートによって決まるのでしょう。

自動生成されたapp.yamlという名前のファイルの内容は以下のようになっていました。app.yamlはGoogle App Engine における設定ファイルのようですね。アクセスされるURLとその機能(=Pythonのソースファイル)を紐づけるような感じでしょうか。

application: helloworld
version: 1
runtime: python
api_version: 1
handlers:
- url: /.*
script: helloworld.py

また、helloworld.py(これがPythonのソースファイルですね)は以下のとおり。

print 'Content-Type: text/plain'
print ''
print 'Hello, world!'

ここで公式サイトのチュートリアルの説明を見ると、まんま上と同じ2つのファイル(中身も完璧に同じ)を作成しろ、となっています。うーん、やりますね、PyDev。

チュートリアルにはapp.yamlの内容説明があります。application idやバージョン管理、すべてのURL(/.*)がhelloworld.pyに紐づけられていること、などですね。

さて、実はこれですでに必要なファイルはできあがってしまっているので、実行しようとしたのですが、どうやってEclipse上から実行すればいいのかいまいちわかりません。

そこで、以下のページを参考にしてみました。

そこには、プロジェクトのpropertyでPYTHONPATHにGoogle App Engineのフォルダを追加しろ、とありました。propertyを確認したところ、これはすでに設定されていました。これは、おそらくPyDevGoogle App Engine Projectとして作成したからでしょう。よしよし。

次は、メニューからRun -> Open Run Dialogを開き、そこで「Python Run」の項目で新たに実行環境設定を作れ、とあります。おそらくEclipseのバージョンの違いでしょう、Run Configurationを選ぶと同じ画面が出てきました。また、「PyDev Google App Run」という項目があるので、こちらで実行環境設定を作ることにします。

  • Project欄:helloworldを選択
  • Main Module欄:Google App Engineフォルダのdev_appserver.pyを指定。これはなぜか選択できないので、ファイル名をフルパスで入力
  • ArgumentタブのProgram Arguments欄に”${project_loc}/src”を入力

この設定を、”Run on GAE local”と名づけて保存。すると、メニューのRunでこれが選べるようになります。選ぶと、Consoleに以下のように表示されて、ローカルの実行環境が起動したことがわかりました!

INFO     2009-08-22 14:23:40,592 appengine_rpc.py:157] Server: appengine.google.com
INFO     2009-08-22 14:23:40,625 appcfg.py:329] Checking for updates to the SDK.
INFO     2009-08-22 14:23:41,592 appcfg.py:343] The SDK is up to date.
WARNING  2009-08-22 14:23:42,296 dev_appserver.py:3358] Could not initialize images API; you are likely missing the Python "PIL" module. ImportError: No module named _imaging
INFO     2009-08-22 14:23:42,390 dev_appserver_main.py:465] Running application helloworld on port 8080: http://localhost:8080

ひとつ警告(WARNING)が出てますが、とりあえずあとまわしにしておきましょう。これで、http://localhost:8080が有効になっているわけですから、さっそくブラウザからアクセスしました。そして、見事に”Hello World!”が表示されました! Yes!

すると、同じくコンソールには

INFO     2009-08-22 14:24:46,078 dev_appserver.py:3029] "GET / HTTP/1.1" 200 -
INFO     2009-08-22 14:24:46,078 dev_appserver_index.py:212] Updating C:\eclipse_wsjvctest\helloworld\src\index.yaml
INFO     2009-08-22 14:24:46,265 dev_appserver.py:3029] "GET /favicon.ico HTTP/1.1" 200 -
INFO     2009-08-22 14:24:49,217 dev_appserver.py:3029] "GET /favicon.ico HTTP/1.1" 200 -

と表示されました。ウェブサーバのアクセスログがほぼそのまま出てくるイメージですかね。でも、favicon.icoにステータス200を返しているわりには、ブラウザのfaviconは変わらなかったけどなぁ。まぁいいか。

また、上の2行目では”index.yamlを更新した”とありますので、Package Explorerを見たら、index.yamlというファイルが以下のような内容で生成されていました。

indexes:
# AUTOGENERATED
# This index.yaml is automatically updated whenever the dev_appserver
# detects that a new type of query is run.  If you want to manage the
# index.yaml file manually, remove the above marker line (the line
# saying "# AUTOGENERATED").  If you want to manage some indexes
# manually, move them above the marker line.  The index.yaml file is
# automatically uploaded to the admin console when you next deploy
# your application using appcfg.py.

このファイルはいまのところは開発者は自分でいじる必要はなさそうですね。また、起動したローカルの実行環境は、Eclipseを終了させれば同時に終了するようです。

さて、今回のチュートリアルはここまでです。次回はGoogle App Engineのウェブアプリケーションフレームワークであるwebappを使ったチュートリアルになります。

GoogleAppEngineのアプリケーションを登録

いよいよGoogleAppEngine(以降GAE)のアカウントを作ります。下記URLから登録します。

このあたりは詳しく説明してくれているサイトがたくさんありますので割愛しましょう。

作ったアプリケーション名は、”mkmk-jp”です。当然、現時点ではまだなにも作っていないので、Dashboardなどを見ても、なんのデータもありません。

さて、これを今後どれだけ充実させていけるでしょうか。