Pylons のコンセプト

Pylons に関する基本コンセプトや、スタックを通したリクエストとレスポンス の流れ、および Pylons がどのように作動するかを理解することは、ものごと がなぜそのように振る舞うのかに関する誤解を解決することに加えて、必要な 際にはカスタマイズすることがより簡単になります。

このセクションは WSGI アプリケーションと WSGI Middleware のコンセプトへの基本的な introduction として機能します。そ して、Pylons が完全に動作するウェブフレームワークを組み立てるのにそれら をどのように利用するかを示します。

以下の説明を読み進める際には、 Getting Started ガイドに従ってプ ロジェクトを作成してください。

Pylons プロジェクトの ‘Why’

新しい Pylons プロジェクトは、他の多くのウェブフレームワークと少し異な る動作をします。フレームワークをロードする (そして、新しいプロジェクト コードを見つけてそれを実行する) のではなく、 Pylons はその正反対をする Python パッケージを作成します。すなわち、それは実行されると Pylons から オブジェクトをインポートして、 WSGI アプリケーションとスタックを組み立 てて、それを返します。

望むなら、新しいプロジェクトでは Pylons インポートを完全に除去してしま い、代わりにどんな任意の WSGI アプリケーションを実行しても構いません。 これは、開発者が必要とする方法で動作するウェブアプリケーションを組み立 てることにおけるより大きな自由度と柔軟性のためです。

デフォルトでは、プロジェクトはほとんどの開発者が必要とする標準コンポー ネント、例えばセッションや、テンプレートエンジンや、キャッシュや、高レ ベルのリクエストおよびレスポンスオブジェクトや、 ORM などを使用 するように構成されます。すべてのセットアップが (‘フレームワーク’ コード に遠く隠されているのではなく) プロジェクトの中にあることにより、開発者 は必要に応じてそれを自由に調整やカスタマイズができます。

このように、 Pylons は開発者によって必要とされるかもしれないものに関す る 意見 を伴ってプロジェクトをセットアップしますが、開発者はプロジェ クトの目標を達成するために必要なツールを自由に使用できます。 Pylons は、 プロジェクトを通してその機能を露出することによって、前例のないカスタマ イズのレベルを提供する一方、コア構成要素の間でただ一つの標準インター フェース (WSGI) を retain することによって、今もなお remarkable amount of simplicity を維持しています。

WSGI アプリケーション

WSGI は、 PEP 333 として知られる、HTTP サーバと対話するための方法を 記述する基本仕様です。これは、リクエストから HTTP ヘッダにアクセスする 方法と、HTTP ヘッダをどのようにセットして、内容をどのように返すかという ことに関係します。

‘Hello World’ WSGI アプリケーション:

def simple_app(environ, start_response):
    start_response('200 OK', [('Content-type', 'text/html')])
    return ['<html><body>Hello World</body></html>']

この WSGI アプリケーションは、レスポンスに 200 ステータスコードを設定し て、 HTTP ‘Content-type’ ヘッダーを設定して、多少の HTML を返す以外、何 もしていません。

WSGI 仕様は environ 辞書にセットされるキーの集合 を定めて います。

WSGI インタフェース、すなわち上に示されるように 2 引数の関数 (または、 クラスのメソッド) を呼んでレスポンスを扱うというこの方法は、制御を次の コンポーネントに渡すための標準インターフェースとして、 Pylons のいたる ところで使用されています。

新しいプロジェクトの config/middleware.py の中では、 WSGI アプ リケーションを作成し、それを WSGI ミドルウェア (以下で説明されます) で ラップして、 HTTP サーバからのリクエストを扱うことができるようにそれを 返すことに対して make_app 関数が責任を持ちます。

WSGI ミドルウェア

config/middleware.py の中では、 Pylons アプリケーションは機能性 を加える連続した層でラップされます。 Pylons アプリケーションをミドルウェ アでラップするプロセスは、概念的にたまねぎの中の層と同様の構造をもたら します。

Pylons middleware onion analogy

ミドルウェアがいったん Pylons アプリケーションをラップするのに使用され ると、 make_app 関数は以下の構造を持つ完成したアプリケーションを返しま す (最外の層が最初に記載されています):

Registry Manager
    Status Code Redirect
        Error Handler
            Cache Middleware
                Session Middleware
                    Routes Middleware
                        Pylons App (WSGI Application)

WSGI ミドルウェアは、ベースの WSGI アプリケーションに機能性を追加するた めに Pylons で幅広く使用されます。 Pylonsでは、 ‘ベース’ WSGI アプリケー ションは PylonsApp です。それは (Routes Middleware から) 渡される environ 辞書の中を looking in することに責 任を持ちます。

この機能がどのように作成されるかを理解するために、 HTTP_REFERER ヘッ ダーを見てそれが Google かどうかを調べる小さなクラスを考えてください:

class GoogleRefMiddleware(object):
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        environ['google'] = False
        if 'HTTP_REFERER' in environ:
            if environ['HTTP_REFERER'].startswith('http://google.com'):
                environ['google'] = True
        return self.app(environ, start_response)

これは WSGI アプリケーションのように呼ばれ、戻り値を返すことができるの で、 WSGI ミドルウェアであるとみなすことができますが、それは environ に 何かを加えてから、初期化時に渡された WSGI アプリケーションを呼び出しま す。新しい Pylons プロジェクトのために構成される WSGI スタック では、 このようにして層が確立されます。

Session, Routes, Cache ミドルウェアのようないくつかの層は、単に environ 辞書にオブジェクトを加えるか、またはレスポンスに HTTP ヘッダ を加えるだけです (例えば、 Session ミドルウェアはセッションクッキーヘッ ダーを加えます)。 Status Code Redirect や、 Error Handler などの他のミ ドルウェアは、リクエストを横取りして、そのレスポンスのしかたを全く変え てしまうこともあります。

コントローラディスパッチ

リクエストがミドルウェアを伝わるとき、入って来た URL は RoutesMiddleware で分析されます。そして、それが URL とマッチした場合は (URL 設定 を見てください) PylonsApp で使用するため、呼び出すべきコントローラの情報が environ 辞書に入れら れます。

PylonsApp は次に、コントローラを見つけようとし ます。 controllers ディレクトリでコントローラの名前と一致するファ イルを探し、その中で同様のスキーム (コントローラ名 + ‘Controller’ 、こ の場合は HelloController) に従ってクラスを検索します。コントローラが見 つかると、それは他の WSGI アプリケーションと全く同じように、 PylonsApp が呼び出されるのと同様の WSGI インタ フェースで呼び出されます。

これが、プロジェクトの lib/base.py モジュールに置かれている BaseController が WSGIController から派生している理由であり、 environstart_response を受け取る __call__ メソッドを持ってい る理由です。 WSGIController は、 Routes が見つけた action に対応する メソッドの場所をクラスの中で見つけ、それを呼び出してリクエストを完了す るレスポンスを返します。

Paster

paster コマンドを何の引数も付けずに単独で実行すると、受け付 けるコマンドの集合が表示されます:

$ paster
Usage: paster [paster_options] COMMAND [command_options]

Options:
  --version         show program's version number and exit
  --plugin=PLUGINS  Add a plugin to the list of commands (plugins are Egg
                    specs; will also require() the Egg)
  -h, --help        Show this help message

Commands:
  create          Create the file layout for a Python distribution
  grep            Search project for symbol
  help            Display help
  make-config     Install a package and create a fresh config file/directory
  points          Show information about entry points
  post            Run a request for the described application
  request         Run a request for the described application
  serve           Serve the described application
  setup-app       Setup an application, given a config file

pylons:
  controller      Create a Controller and accompanying functional test
  restcontroller  Create a REST Controller and accompanying functional test
  shell           Open an interactive shell with the Pylons app loaded

paster が Pylons プロジェクトの中で実行された場合、出力結果 はこのようになるはずです。最後のセクション pylons は、 Pylons プロジェ クトの中で実行しなければ存在しないでしょう。これは、 paster スクリプトが利用可能なコマンドを決定するために使用する、ダイナミックな プラグインシステムのためです。

Pylons プロジェクトの中には、 .egg-info で終わるディレクトリがあり、 その中に paster_plugins.txt ファイルがあります。このファイルは paster スクリプトによって検索され読み込まれます。そして、他 のどんなパッケージからコマンドを動的に検索すべきかを決定するために使わ れます。上で示されるように、 Pylons でもいくつかのコマンドが提供されて いて、 Pylons プロジェクトで使えるようになっています。

アプリケーションのロード

アプリケーションを実行する (したがってロードする) には、 paster コマンドが使用されます。

$ paster serve development.ini

これは、 paster スクリプトに ‘serve’ モードに入るよう指定します。 paster は指定された構成ファイルを構文解析して、サーバとサーブすべき WSGI アプリケーションの両方をロードすることを試みるでしょう。それは [server] ブロックを見てどんなサーバを使用するかを決定します。そして [app] ブロックを見てどの WSGI アプリケーションを使用すればよいかを決 定します。

helloworld プロジェクトのための development.ini の中の基本的 な egg ブロック:

[app:main]
use = egg:helloworld

これは WSGI アプリケーションの場所を見つけるために helloworld egg を読み込むことを paster に伝えます。新しい Pylons アプリケー ションでは、 WSGI アプリケーションを作るためにどんな関数が呼ばれるかを 示す行が setup.py にあります:

entry_points="""
[paste.app_factory]
main = helloworld.config.middleware:make_app

[paste.app_install]
main = pylons.util:PylonsInstaller
""",

ここでは Paste (paster を提供しているパッケージ) が使用すべ き main WSGI アプリケーションとして make_app 関数が指定されています。

その後プロジェクトの make_app 関数が呼ばれて、サーバ (デフォルトで、 HTTP サーバ) が WSGI アプリケーションを実行します。

Read the Docs v: v1.0.1rc1
Versions
latest
v1.0.1rc1
v0.9.7
Downloads
PDF
HTML
Epub
On Read the Docs
Project Home
Builds

Free document hosting provided by Read the Docs.