はじめての Pyramid アプリケーションを作る

この章では、簡単な Pyramid アプリケーション作成を経験してみます。 アプリケーション作成を経て、どのように動作するのかについて詳しく解説して いきます。すでに Pyramid のインストールは完了している事を前提 として進行します。もしまだインストールが完了していない場合は Pyramid のインストール セクションを参照してください。

Hello World

以下に最もシンプルな Pyramid のアプリケーションの一つを示します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response


def hello_world(request):
    return Response('Hello %(name)s!' % request.matchdict)

if __name__ == '__main__':
    config = Configurator()
    config.add_route('hello', '/hello/{name}')
    config.add_view(hello_world, route_name='hello')
    app = config.make_wsgi_app()
    server = make_server('0.0.0.0', 8080, app)
    server.serve_forever()
   

上記コードを helloworld.py として保存し、 Pyramid がインストール された環境の Python インタプリタで実行すると TCP ポートの 8080 番で HTTP サーバーが起動します。

UNIX の場合:

$ /path/to/your/virtualenv/bin/python helloworld.py

Windows の場合:

C:\> \path\to\your\virtualenv\Scripts\python.exe helloworld.py

このコマンドはコンソールに出力を返しません。ブラウザによって 8080 番 ポートは /hello/world という URL でアクセスされた場合、サーバーは “Hello world!” と返すだけです。もしこのアプリケーションをローカルで 動作させている場合、 http://localhost:8080/hello/world という URL をブラウザに対して利用する事でその結果を見ることができます。

ブラウザでこのアプリケーションによって提供されている URL にアクセスする 度にホスト名、日時、リクエストメソッドおよびパスその他の付加情報が コンソール上にログとして出力されます。この出力は、我々がアプリケーションを 提供するために利用している wsgiref サーバーによって返されます。 これはコンソール上に Apache と同型の “アクセスログ” をログ出力します。

Ctrl-C ( Windows の場合は Ctrl-Break ) を押すことで アプリケーションを停止させる事ができます。

アプリケーションが何を行うかを簡単に理解した所で、部分部分を検証します。

インポート

先に示した helloworld.py スクリプトは下記のインポート宣言を利用して います。

1
2
3
from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response

このスクリプトは Configurator クラスを pyramid.config モジュールからインポートします。 Configurator のインスタンスは、Pyramid アプリケーションを定義する際に利用します。

他の多くの Python 製 Web フレームワーク同様、 Pyramid は Web サーバーとアプリケーションとの互いの接続のために WSGI プロトコル を利用しています。 wsgiref サーバーは簡単のためにこの例では WSGI サーバーとして使用され、Python の標準ライブラリに含まれています。

このスクリプトはまた pyramid.response.Response クラスを後で 利用するためインポートしています。このクラスのインスタンスは Web の レスポンスを作成するために使われています。

view callable (ビュー呼び出し可能オブジェクト)の定義

先に示したスクリプトで、インポート分に続くのは hello_world と名付けられた関数の定義です。

1
2
def hello_world(request):
    return Response('Hello %(name)s!' % request.matchdict)

この関数は引数を1つ ( request ) 取り、 pyramid.response.Response クラスのインスタンスを返します。 このクラスのコンストラクタに対する1つの引数は URL にマッチしたパラメータ から算出された文字列です。返す値はレスポンスのボディになります。

この関数は view callable (ビュー呼び出し可能オブジェクト)とも 呼ばれています。1つの view callable は1つの引数 request を受け取ります。この関数は response オブジェクトを返すことを 期待されています。 view callable は関数である必要が無く、別の オブジェクトの型、たとえばクラスあるいはインスタンス でも意味をなします。しかしここでは関数として利用することにします。

view callable は通常 request オブジェクトと共にコールされます。 1つの request オブジェクトは WSGI サーバーを通して Pyramid に送信された HTTP リクエストを意味しています。

1つの view callable は1つの response オブジェクトを 返す必要が有ります。それは1つの response オブジェクトは実際の HTTP レスポンスを決定するのに必要な全ての情報が含まれているからで、この オブジェクトは Pyramid をコールした WSGI サーバーによってテキストに 変換されて、リクエストを送信したブラウザに返されます。レスポンスを返すため には、各 view callable が Response クラスの インスタンスを一つ一つ作成できる必要が有ります。上記の hello_world 関数では一つの文字列がレスポンスのボディとして処理されます。

アプリケーションの定義

上記のスクリプトでは、下記の部分がこのシンプルなアプリケーションを 定義している箇所 になります。このアプリケーションは直前で定めた インポートと関数の設定によって定義付けられており、if 文の中に 記述されています。

1
2
3
4
5
6
7
if __name__ == '__main__':
    config = Configurator()
    config.add_route('hello', '/hello/{name}')
    config.add_view(hello_world, route_name='hello')
    app = config.make_wsgi_app()
    server = make_server('0.0.0.0', 8080, app)
    server.serve_forever()

それではもっと細かく見て行きましょう。

Configurator Construction

1
2
if __name__ == '__main__':
    config = Configurator()

上記の if __name__ == '__main__': というサンプルコードの行は Python で 頻繁に用いられます。このコードの if 文の中は OS のコマンドラインから直接 上記コードを含むスクリプトが呼び出された時に限って実行されます。例えば、 この helloworld.py と命名されたファイルが上記スクリプトを完全に内部に 保持していた場合、 if 文の中のコードはコマンドラインから python helloworld.py が実行された時に限って処理されます。

上記 if 文の利用は必須、少なくとも最も合理的であると言えます。 なぜならば Python の .py ファイル内のコードは、 Python の import 文を用いる事で他の .py ファイルにインポートされる場合が有るためです。 ある .py ファイルにインポートされた .py ファイルは module (モジュール)と呼ばれます。 if __name__ == '__main__': を利用する事で、 上記のスクリプトはコード中の if 文内に記述された処理を、このモジュールが 他のスクリプトにインポートされた際に実行を期待されない事、直接スクリプトを 実行された時のみ if 文中のコードの実行が期待される事を示しています。

config = Configurator() の行では Configurator クラスのインスタンスを生成しています。結果として生成される config オブジェクトはこの特別な Pyramid アプリケーションを定義するために スクリプトが利用する API として機能します。この Configurator オブジェクト 上でコールされたメソッドは、アプリケーションに関連付けられた application registry (アプリケーション・レジストリ)に対して 登録を行います。

Adding Configuration (補足設定)

1
2
    config.add_route('hello', '/hello/{name}')
    config.add_view(hello_world, route_name='hello')

上記のコードの1行目は、その後ろに文字列が続く /hello/ から始まる あらゆる URL のパスにマッチする route (経路)を登録する pyramid.config.Configurator.add_route() メソッドを呼び出しています。

続く行では config.add_view(hello_world, route_name='hello') という 記述で hello_world 関数を view callable として登録し、 経路 hello にマッチした場合に呼び出されるように設定しています。

WSGI アプリケーション作成

1
    app = config.make_wsgi_app()

ビューの設定が終わると、このスクリプトは pyramid.config.Configurator.make_wsgi_app() メソッドを利用して 1つの WSGI アプリケーション を作成します。 make_wsgi_app に対する コールは全ての設定が完了した(ビューを定義する configurator に対して必要な メソッドが全てコールされ、追加の設定も処理されている)状態である事を 意味します。 make_wsgi_app メソッドはリクエスト送信者に対して アプリケーションを提供するあらゆる WSGI サーバーに利用される WSGI アプリケーションのオブジェクトを返します。 WSGI は サーバーが Python アプリケーションとやり取りを行う1つの手段です。 このガイドブックでは WSGI に関してこれ以上深く解説を行いませんが、 wsgi.org を訪れることでより詳しく学ぶことができます。

特に Pyramid アプリケーションオブジェクトは Pyramid の ルーター ( router ) を表現するクラスのインスタンスです。 このオブジェクトは 自身を定義するのに利用されたコンフィギュレーターに 対するメソッド呼び出しの結果とである application registry を 参照しています。ルーター ( router ) は1つのアプリケーションで 選択された方針に従うためにレジストリを使用します。これらの方針の選択は 前もって行われる Configurator に対するメソッド呼び出しによって 設定されます。このチュートリアルでは、 add_view および add_route メソッドに対する呼び出しによって方針が設定されます。

WSGI アプリケーションとして起動

1
2
    server = make_server('0.0.0.0', 8080, app)
    server.serve_forever()

最後に WSGI サーバーを起動することでリクエスト送信者にアプリケーションを 提供します。そのためにここでは wsgiref インタフェースの make_server を利用します。最初の引数 '0.0.0.0' は ” 全ての TCP インタフェースを接続待ち状態にする ” 事を意味します。標準ではこの HTTP サーバーは 127.0.0.1 インタフェースのみで接続待ち状態になり、これは あなたがこのサーバーをリモートで動作させており、ローカルから ウェブブラウザーを利用してサーバーにアクセスしようとする際に問題になる 場合が有ります。加えて接続待ち状態にする TCP ポートも第2引数で 8080 番に 設定します。最後の引数では app オブジェクト ( 1つの:term:router ) を指定し、動作させたいアプリケーションを指定します。最後に、外部からの リクエストを待機し続けるメインループをスタートさせるため、サーバーの serve_forever メソッドを呼び出します。

この行が実行されると、 TCP ポートの 8080 番で接続待ち状態がサーバーに よって開始されます。このサーバーは、私達が動作しているプロセスを殺す ( 通常は Ctrl-C もしくは Ctrl-Break のショートカットをターミナル 上で利用する ) までリクエストに対して応答し続けます。

総括

私達がここで取り組んだ hello world アプリケーションは可能な限り最も シンプルな Pyramid アプリケーションの1つであることは “間違いありません” 。そう断言できるのは、私達がコンフィギュレーションを 設定する際に Python の全ての力を利用する事ができるためです。

参照

Configurator オブジェクトの API に関するさらなる情報は、 Configurator を参照して下さい。

view configuration に関するさらなる情報は View Configuration を参照して下さい。