webpy_tutorial_ja

日本語版作成 kinneko <kinneko@gmail.com>

Original: http://webpy.org/tutorial

web.py チュートリアル

他言語への翻訳: ロシア語 スペイン語 ポルトガル語: 1 2 3 
 

インストール

 このチュートリアル全体を試すには、web.py, flup, Cheetah, psycopg2,  Postgres をインストールしておく必要があります。詳細は、 web.py のトップページを参照してください。
 

URLの操作

 お好みのエディタを起動し、"code.py" とでも名前を付けて新しいファイルを作り、次のようにタイプしてください:

	import web

 この行で、web.py のフレームワークを読み込みます。

	urls = (
'/', 'view'
)

 これは、機能が割り当てられるURLの一覧を表現しています。
 最初の部分は、パス表現と一致するもので、正規表現が使え、普通は /, /help/faq, /item/(\d+) などのように使います(\d+は数字の並びと一致するものです。括弧は後に続く一致する部分を捕獲するために使います)。
 二番目の部分は、リクエストを送るためのクラスの名前です。たとえば、viewwelcomes.hello(welcomesモジュールのhelloクラスを得る) や get_\1 のように使います。\1は、正規表現で最初に取得されたものに置き換えられます。どのような値が得られても、すべてあなたの作った関数に引き渡されます。

	class view:
def GET(self):

 これは、GET関数を備えたHELLOクラスです。すでにお察しのように、誰かがあなたたのURLを HTTP GET メソッドで呼び出したときに、GETが呼ばれます(たとえば誰かがブラウザであなたのURLを開くような場合のことです)。

	 print "Hello, world!"

 これは、訪問者に 'Hello, world' とプレーンテキストを返す部分です。

	web.internalerror = web.debugerror

 この行は、要求されたリクエストがエラーになる場合は常に、多くの有用なデバッグ情報を備えたページを web.py に表示させます。あなたは、サイトを公開する時には、ユーザーがエラーページを見ることがないよう、この行をコメントアウトしたいと思うでしょう。

	if __name__ == '__main__': web.run(urls, web.reloader)

 この部分は、ファイルが実行されたときに、あなたのアプリケーションを動かすように web.py に命じるものです。最初の項目であるurlsは、ここより前に書かれたURLと関数の結びつきを定義しています。もう1つの項目は、「ミドルウエア」用の ものです。それは、あなたのアプリケーションのいくつかの部分を補助するためのラッパー機能です。reloader を使うと、ソースコードが変更されたときには自動的に再読み込みします。したがって、わたしたちは毎回サーバーを再起動させる必要がありません。あなたは おそらく、サイトを公開する時に、すぐにもこの機能を使いたいと思うでしょう。それは開発中には貴重なものです。さらに、web.profiler というものもあります。profiler は、それぞれの機能がページ生成を完了するまでにどのくらいの時間を使ったかという情報を出力します。これを使うことによって、コードをより速くすること ができます。

 あなたのアプリケーションを動かすWebサーバーを起動させるために、"python code.py" と実行してみてください。ポート8002を指定して動作させる場合は、"python code.py 8002" のようにします。code.py を CGI や FastCGI のスクリプトとして動作させることもできます。それは自動的にきちんと動くでしょう。また、web.py は Python の Webアプリ用インターフェイスの標準である WSGI の上に作られているので、WSGI に対応した mod_python を含む全てのプログラムの中で実行できます。

 さあ、ブラウザであなたが作ったサイトをアクセスしてみましょう。'Hello, world!' と表示されるのが確認できるでしょう。
 

テンプレートを使う

"templates" と名付けた新しいディレクトリを作りましょう。その中には、名前が".html"で終わる新しいファイルを置きましょう。たとえばここではそれを "view.html" としましょう。

	#if $name
I just wanted to say hello to $name.
#else
Hello, world!
#end if

code.py にもどって、. view.GET を次のように変更します:

 name = 'Bob'
web.render('view.html')

 ブラウザであなたが作ったサイトをアクセスしてみると、Bob にこんにちはと言っているのが確認できるでしょう。

 これらのテンプレート機能は、Cheetah テンプレートエンジンが実現するものです。Cheetah のすべての重要な機能は、たった1ページのチュートリアルに網羅されています。ほとんどの場合、それは Python コードに HTML (や、あなたが書いたその他のどんなフォーマットでも)を組み込む場合と同じように動くでしょう。

注意:
現在の計画では、Cheetah はもう少し単純でパワフルな別の何かに置き換えられる予定です。このフォーマットは、デザインは済んでいますが、まだ実装が完全に終わっていません。
 

カスタムURL

 URLリストを以下のように書き換えてみましょう:

	 '/(.*)', 'view'

 view.GET も同様に書き換えます:

	 def GET(self, name):

name を定義している行を削除してください。

 "/Joe" に ブラウザでアクセスすると、Joe にこんにちはと言っているのが確認できます。"/" にアクセスすると、'Hello, world!' が表示されます。

データベースを使う

web.run 行の上に追記します:

	web.db_parameters = dict(dbn='postgres', user='me', pw='pass', db='dbname')

使っているデータベースプログラムの設定状況にあわせて、それぞれの値を反映させましょう。たとえば、MySQL を使っている人は、 dbnmysql に変更したいでしょう。

 データベースに単純なテーブルを1つ定義します:

	CREATE TABLE todo (
id serial primary key,
title text,
created timestamp default now(),
done boolean default 'f'
);

 サンプルデータも追加します:

	INSERT INTO todo (title) VALUES ('Learn web.py');

code.py にもどって、view.GET の先頭に以下を追記します:

	 todos = web.select("todo")

view.htmlを以下のように変更します:

	<ul>
#for todo in $todos
<li id="t$todo.id">$todo.title</li>
#end for
</ul>

 サイトを表示すると、'Learn web.py' という予定が1つ表示されます。

view.htmlの末尾に以下を追記します:

	<form method="post" action="add">
<p><input type="text" name="title" /> <input type="submit" value="Add" /></p>
</form>

 urls リストを以下のように変更します:

	 '/', 'view',
'/add', 'add'

view.GET を変更し、追加のパラメータを取り除きます:

	 def GET(self):

 そして、 view クラスの真下に以下を追記します:

	class add:
def POST(self):
i = web.input()
n = web.insert('todo', title=i.title)
web.seeother('./#t'+str(n))

 web.insert は、新しく挿入された項目のIDを返します。そして、 web.seeother はそのユーザーをリダイレクトするのに使います。

あとは簡単に: web.transact() はトランザクションを開始します。web.commit() はそれをコミットし、web.rollback() はロールバックします。web.update は、web.insert と同じですが, id を返すのではなく,逆に id (または WHERE 節を表す文字列) をテーブル名の次の引数にとります。

 もう、あなたはリストに予定項目を追加できるようになったことでしょう。
 

余談:ストレージオブジェクト

web.inputweb.query は、web.py の中の他の多くのものと同様に「ストレージオプジェクト」を返します。 ストレージオブジェクトは、 d.foo が d['foo'] と同じ結果になることをのぞいて、Python のディクショナリに似ています。これを使うと、タイピングの量を減らすことができます。 
 

クッキーを使う

 クッキーは、 web.inputとよく似た方法で働きます。 web.cookies() は、設定されたすべてのクッキーを返すストレージオブジェクトです。 web.setcookie(name, value, expires="") でクッキーを設定します。

 web.input
web.cookies は、一連のキーワードとキーワード引数を持ちます。もし、たとえば web.input('color', times=1) のように呼び出せば、color と名付けられた変数を受け取らなかったり、値を1にセットされる times を受け取らなかった場合、エラーを返すでしょう。

 共通する慣用表現は以下のようになります:

	try: i = web.input('foo', bar=2)
except KeyError: return web.badrequest()

これでチュートリアルは終わりです。次は forms に進んでください。

もっと詳しく知りたい? では、完全な解説を調べてください。

コメント、質問、意見、要望はメールでどうぞ。 Email webpy@aaronsw.com