アプリケーションの起動

Pyramid と Pylons は、両方とも PasteDeploy およびその INI フォーマット 設定ファイルを使用するので、同様に開始します。これは、たとえ Pyramid 1.3 が “paster” を自分自身のコマンドに置き換えたとしても真です。 “pserve” と “paster serve” の両方は下記を行います:

  1. INI ファイルを読む。
  2. “[app:main]” セクションに基づいてアプリケーションをインスタンス化する。
  3. “[server:main]” セクションに基づいてサーバをインスタンス化する。
  4. logging セクションに基づいて Python logging を構成する。
  5. アプリケーションとともにサーバを呼び出す。

ステップ 1-3 と 5 は本質的に PasteDeploy のラッパーです。ステップ 2 だけが実際に「Pyramid を使用」しています。なぜならアプリケーションだけが Pyramid の他の部分に依存するからです。ルーチンの残りは “paster serve” から直接コピーされ、 Pyramid の他の部分には依存しません。

ランチャーがアプリケーションをインスタンス化する方法はしばしば誤解されます。 したがって、しばらく立ち止まって詳細を説明しましょう。これは Akhet デモの app セクションの一部です:

[app:main]
use = egg:akhet_demo#main
pyramid.reload_templates = true
pyramid.debug_authorization = false

“use=” 行は間接的に Python callable をロードするように指名します。 “egg:” は、エントリポイントによって Python オブジェクトを調べるように言います (エントリポイントは Setuptools によって提供される機能です。これが Pyramid/Pylons が Distribute のインストールを要求する理由です)。 “akhet_demo” は、 look in する Python ディストリビューション (Pyramid アプリケーション) の名前です。また “main” はエントリポイントです。 ランチャは Setuptools の pkg_resources.require("akhet_demo#main") を 呼び、 Setuptools が Python オブジェクトを返します。エントリポイントは ディストリビューションの setup.py に定義されています。また、インストーラ はエントリポイント・ファイルにそれらを書きます。 これは akhet_demo.egg-info/entry_points.txt ファイルです:

[paste.app_factory]
main = akhet_demo:main

“paste.app_factory” は、エントリポイント・グループです (互換性を保ちたい すべてのアプリケーションのためにPasteDeploy ドキュメント中で公表されている 名前)。 “main” (等号の左側) はエントリポイントです。 “akhet_demo:main” は、 akhet_demo パッケージをインポートして “main” 属性をロードするように言います。これは akhet_demo/__init__.py で 定義された main() 関数です。 “[app:main]” セクションの他のオプション は、この callable へのキーワード引数になります。これらのオプションは、 Pyramid では “settings” 、Pylons では “config variables” と呼ばれます。 (“[DEFAULT]” セクション中のオプションも、デフォルト値として渡されます。) 両方のフレームワークは、アプリケーションコード中でこれらの変数にアクセス する方法を提供します。 Pyramid では request.registry.settings 辞書の 中に、Pylons では pylons.config 特殊グローバル変数の中にあります。

ランチャーは、 “[server:main] セクションを使って同じ方法でサーバーを ロードします。

より詳細: paste.deploy.loadwsgi の中で loadapp() および loadserver() によって重労働 (heavy lifting) が行われます。 loadwsgi は難解 (obtuse) でドキュメント化されていませんが、 pyramid.paster には そのルーチンのいくつかを呼ぶ、または模倣する便利な関数があります。

mod_wsgi のような代替ランチャは、 “[app:main]” セクションだけを読んで server セクションを無視しますが、それらもやはり PasteDeploy またはその 等価物を使用しています。 “The Main Function” の章で見るように、 INI ファイルや PasteDeploy なしでアプリケーションを手動でインスタンス化する ことも可能です。

ランチャーがどのようにアプリケーションをロードするかについてより詳しいことが 分かったので、次に Pyramid アプリケーション自体により接近して見てみましょう。

Previous topic

イントロダクションとアプリケーションの作成

Next topic

INI ファイル