03:.iniファイルを使ったアプリケーションの設定(03: Application Configuration with .ini Files)

Pyramidの「pserve」コマンドを「.ini」設定ファイルとともに使用するとより簡単でより優れたアプリケーションの実行が可能になります。

背景(Background)

Pyramidには コードとは異なる構成のファーストクラスの configuration があります。このアプローチはオプションですが、その存在は他のPython Webフレームワークとは差別かされます。これは「setuptools」 、Pythonプロジェクトの「エントリーポイント」をインストールして規則を定めるPythonのライブラリーを利用します。Pyramidはエントリポイントを使用して、PyramidアプリケーションにWSGIアプリケーションの検索場所を知らせます。

目標(Objectives)

  • 「setup.py」を修正してPyramidにWSGIアプリケーションの場所を知らせるエントリポイントを持つようにしてください。
  • 「.ini」ファイルによって駆動されるアプリケーションを作成します。
  • Pyramidの「pserve」コマンドでアプリケーションを起動します。
  • コードをパッケージの「__init__.py」に移動します。

手順(Steps)

  1. 最初に、前の手順の結果をコピーします:

    $ cd ..; cp -r package ini; cd ini
    
  2. 「ini/setup.py」は setup() 関数内でsetuptoolsの「エントリポイント」で必要です:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    from setuptools import setup
    
    requires = [
        'pyramid',
        'waitress',
    ]
    
    setup(name='tutorial',
          install_requires=requires,
          entry_points="""\
          [paste.app_factory]
          main = tutorial:main
          """,
    )
    
  3. プロジェクトをインストールするできて、こうして「egg」(ini/tutorial.egg-info)を生成(または再生成)できます:

    $ $VENV/bin/pip install -e .
    
  4. 設定用の「ini/development.ini」ファイルを作ってみましょう:

    1
    2
    3
    4
    5
    6
    [app:main]
    use = egg:tutorial
    
    [server:main]
    use = egg:waitress#main
    listen = localhost:6543
    
  5. We can refactor our startup code from the previous step's app.py into ini/tutorial/__init__.py:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    from pyramid.config import Configurator
    from pyramid.response import Response
    
    
    def hello_world(request):
        return Response('<body><h1>Hello World!</h1></body>')
    
    
    def main(global_config, **settings):
        config = Configurator(settings=settings)
        config.add_route('hello', '/')
        config.add_view(hello_world, route_name='hello')
        return config.make_wsgi_app()
    
  6. 「ini/tutorial/app.py」は使われていないので削除しましょう:

    $ rm tutorial/app.py
    
  7. Pyramidアプリケーションを以下のように実行します:

    $ $VENV/bin/pserve development.ini --reload
    
  8. http://localhost:6543/ を開きます。

分析(Analysis)

「development.ini」ファイルは「pserve」によってアプリケーションを読み込みブートストラップします。処理に関しては、Pyramidの章の application startup で説明があるように進行します。

  • 「pserve」は [app:main] を探して 「use = egg:tutorial」を見つけます。
  • プロジェクト「setup.py」は、プロジェクトの「main」のtutorial:mainでのエントリーポイントの「entry point」(10〜13行目)を定義しています。
  • 「tutorial」パッケージの「__init__」は「main」関数を持っています。
  • この関数は、特定の「.ini」セクションに値が渡されると呼び出されます。

「.ini」ファイルは2つの他の関数にも使用されます:

  • WSGIサーバーを設定します。 「[server:main]」はどのWSGIサーバーをWSGIアプリケーション用に選択するかが決まります。今回はチュートリアルの始めに、この例では、「tutorial/setup.py」で指定した「waitress」を使用しています。このチュートリアルの最初で 要件(Requirements) ステップにインストールされています。。「listen = localhost:6543」は、ホストがlocalhostでポートは6543で待機するようにwaitressに指示します。

    注釈

    「$VENV/bin/pip install -e .」コマンドを実行すると、パッケージのファイルで指定されている仮想環境内の以前にインストールされた 「setup.py」パッ"ケージがチェックされます。パッケージが編集可能なモードでインストールされ、以前にインストールされていなかったrequirementがインストールされます。requirementが以前にコマンドライン「 $VENV/bin/pip install -e 」などで手動でインストールされていた場合(この場合はWaitress)、インストールされていることを確認するのみです。

  • Pythonロギングの設定。PyramidはPythonの標準のロギングを使用しています。これにはいくつかの値の設定が必要です。「.ini」でこの機能を提供しています。これにより、起動時および各リクエスト実行時に表示されるコンソールログ出力が提供されます。

スタートアップコードを「app.py」からパッケージ「tutorial/__init__.py」に移行しました。これは必ずしも必要ではありませんが、PyramidではモジュールのコードからWSGIアプリのブートストラップを取り出して「__init__.py」パッケージに入れるのが一般的なスタイルです。

「pserve」アプリケーションのランナーは、いくつかのコマンドライン引数とオプションを持っています。「--reload」これはpserveで関連するコード(Pythonファイル、INIファイルなど)の変更をファイルシステムで監視するよう指示するものに使用しています。変更があった場合はアプリケーションを再起動します。開発中に非常に便利です。

エクストラクレジット(Extra credit)

  1. 設定や「.ini」ファイルが気に入らない場合は、Pythonコードでこれを実行できますか?
  2. プロジェクトに複数の「.ini」設定ファイルを持たせられますか?なぜあなたはそれをしたいのですか?
  3. 「__init__.py」のエントリポイントは、「tutorial:main」関数を宣言したときsetup.pyは言及しなかった。なぜでしょうか?
  4. **settings」の目的は何ですか? 「**」の意味は何ですか?"