(機械翻訳) あなたの最初の作成 Pyramid アプリケーション¶
この章では、小さな:app: `Pyramid`アプリケーションの作成について説明します。アプリケーションの作成が完了したら、その動作をより詳しく説明します。既に:app: `Pyramid`がインストールされていることを前提としています。もしそうでなければ、:ref: `installing_chapter`セクションに向かいます。
こんにちは世界¶
非常にシンプルなアプリケーションのひとつ:app: `Pyramid`アプリケーション:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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__':
with Configurator() as config:
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``という名前のPythonスクリプトに挿入し、:app: `Pyramid`ソフトウェアがインストールされたPythonインタプリタで実行すると、TCPポート8080でHTTPサーバが起動します。
UNIXの場合:
$ $VENV/bin/python helloworld.py
Windowsの場合:
c:\> %VENV%\Scripts\python helloworld.py
このコマンドは戻らず、コンソールに何も表示されません。ポート8080がブラウザーによって `` / hello / world``のURLにアクセスされると、サーバーは単純に"Hello world!"というテキストを提供します。あなたのアプリケーションがあなたのローカルシステムで実行されている場合は、 <http://localhost:8080/hello/world> `_はブラウザでこの結果を表示します。
ブラウザでアプリケーションが提供しているURLにアクセスするたびに、ホスト名、日付、要求の方法とパス、およびその他の情報が表示されます。この出力は、このアプリケーションを提供するために使用したwsgirefサーバーによって行われます。これは、コンソールにログ記録形式を組み合わせたApacheの"アクセスログ"を記録します。
アプリケーションを停止するには、 `` Ctrl-C``(Windowsでは `` Ctrl-Break``)を押してください。
アプリケーションが何をしているのかについての初歩的な理解があったので、それを少しずつ調べてみましょう。
輸入¶
上記の `` helloworld.py``スクリプトは、以下のimport文のセットを使用します:
1 2 3 | from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response
|
このスクリプトは、:mod: pyramid.config`モジュールから:class:〜pyramid.config.Configurator`クラスをインポートします。 :class: 〜pyramid.config.Configurator`クラスのインスタンスは、後で:app: Pyramid`アプリケーションを設定するために使われます。
他の多くのPython Webフレームワークと同様に、:app: Pyramid`は:term: WSGI`プロトコルを使用して、アプリケーションとWebサーバーを一緒に接続します。 :mod: `wsgiref`サーバは、この例では、Python標準ライブラリに含まれているため、便宜上WSGIサーバとして使用しています。
このスクリプトは、後で使うために:class: `pyramid.response.Response`クラスもインポートします。このクラスのインスタンスは、Webレスポンスの作成に使用されます。
コール可能な宣言の表示¶
上記のスクリプトは、インポートセットの下に、 `` hello_world``という名前の関数を定義しています。
6 7 | def hello_world(request):
return Response('Hello %(name)s!' % request.matchdict)
|
関数は単一の引数( `` request``)を受け取り、:class: `pyramid.response.Response`クラスのインスタンスを返します。クラスのコンストラクタへの単一の引数は、URLから一致したパラメータから計算された文字列です。この値は応答の本体になります。
この関数はa:term: view callable`と呼ばれます。ビュー呼び出し可能関数は、単一の引数 ` request``を受け取ります。 :term: `response`オブジェクトを返すことが期待されます。ビュー呼び出し可能は関数である必要はありません。クラスやインスタンスのような別のタイプのオブジェクトを介して表現することもできますが、ここでは関数がうまく機能します。
ビューcallableは常に:term: request`オブジェクトで呼び出されます。リクエストオブジェクトは、active:term: `WSGI`サーバを介して:app: Pyramid`に送信されたHTTPリクエストの表現です。
レスポンスオブジェクトは実際のHTTPレスポンスを定式化するのに必要なすべての情報を持っているため、view:callableはa:term: response`オブジェクトを返す必要があります。このオブジェクトはPyramidを呼び出した:term: `WSGI`サーバによってテキストに変換され、要求元のブラウザに返送されます。レスポンスを返すために、呼び出し可能な各ビューは:class: `〜pyramid.response.Response`クラスのインスタンスを作成します。 ` hello_world``関数では、文字列が本文として応答に渡されます。
アプリケーション構成¶
上記のスクリプトでは、次のコードはこの単純なアプリケーションの*設定*を表しています。アプリケーションは、定義済みのインポートと関数定義を使用して設定され、 `` if``ステートメントの範囲内に配置されます:
9 10 11 12 13 14 15 | if __name__ == '__main__':
with Configurator() as config:
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()
|
これを一枚ずつ壊しましょう。
コンフィグレータの構築¶
9 10 | if __name__ == '__main__':
with Configurator() as config:
|
上のコードサンプルの `` if __name__ == '__main __': ``行は、Pythonイディオムを表します。このif節内のコードは、このコードを含むスクリプトがオペレーティングシステムのコマンドラインから直接実行されない限り呼び出されません。たとえば、 `` helloworld.py``という名前のファイルにスクリプト本体全体が含まれている場合、 `` if``文内のコードは `` python helloworld.py``がコマンドラインから実行されたときにのみ呼び出されます。
Pythonの `` .py``ファイルのコードは、Pythonの `` import``文を介して別の `` .py``でインポートされる可能性があるため、 `` if``節を使用する必要があります。ファイル。他の `` .py``ファイルによってインポートされる `` .py``ファイルは、* modules *と呼ばれます。上記のスクリプトは、 `` if __name__ == '__main __': ``イディオムを使用することによって、このモジュールが別のモジュールからインポートされた場合に `` if``文内のコードを実行したくないことを示しています。 `` if``ブロック内のコードは直接スクリプトの実行中にのみ実行されるべきです。
上記の `` Configurator()as config: ``行は、:term: context manager`を使用して:class:〜pyramid.config.Configurator`クラスのインスタンスを作成します。生成される `` config``オブジェクトは、この特定の:app: `Pyramid`アプリケーションを設定するためにスクリプトが使用するAPIを表します。コンフィグレータで呼び出されるメソッドは、アプリケーションに関連付けられた:term: `アプリケーションレジストリ 'で登録を行います。
設定の追加¶
11 12 | config.add_route('hello', '/hello/{name}')
config.add_view(hello_world, route_name='hello')
|
上記の最初の行は:meth: pyramid.config.Configurator.add_route`メソッドを呼び出します。このメソッドは、 / hello / で始まり、その後に文字列が続くURLパスにマッチする:term: route`を登録します。
2行目は `` hello_world``関数を:term: view callable`として登録し、 `hello``ルートが一致したときに呼び出されるようにします。
WSGIアプリケーションの作成¶
13 | app = config.make_wsgi_app()
|
ビューの設定と設定の終了後、スクリプトは:meth: pyramid.config.Configurator.make_wsgi_app`メソッドを使用してWSGI *アプリケーション*を作成します。 ` make_wsgi_app``を呼び出すことは、すべての設定が終了したことを意味します(ビューやその他の設定を行うコンフィギュレータへのすべてのメソッドコールが実行されたことを意味します)。 `` make_wsgi_app``メソッドは:term: `WSGI`アプリケーションオブジェクトを返します。これは、任意のWSGIサーバがリクエスタにアプリケーションを提示するために使用できます。 :term: `WSGI`はサーバがPythonアプリケーションと通信するためのプロトコルです。私たちは議論しません:用語: `WSGI`はこの本の中で深く考えていますが、 <https://wsgi.readthedocs.io/en/latest/> `_。
:app: Pyramid`アプリケーションオブジェクトは、特に:app: Pyramid`:term: router`を表すクラスのインスタンスです。これには:term: `アプリケーションレジストリ 'への参照があります。これは、それを設定するために使用されたコンフィギュレータへのメソッド呼び出しに起因します。 :term: `router`は、単一のアプリケーションによって行われたポリシー選択に従うためにレジストリに問い合わせます。これらのポリシー選択は、:term: `Configurator`へのメソッド呼び出しによって通知されました。私たちの場合、唯一のポリシー選択は、 ` add_view``と `` add_route``メソッドの呼び出しによって暗示されました。
WSGIアプリケーションの提供¶
14 15 | server = make_server('0.0.0.0', 8080, app)
server.serve_forever()
|
最後に、実際にはWSGIサーバーを起動してリクエスタにアプリケーションを提供します。この目的のために、:mod: wsgiref` make_server``サーバメーカーを使用します。我々は最初の引数 ` '0.0.0.0'``として渡します。これは"すべてのTCPインタフェースで待ち受ける"を意味します。デフォルトでは、HTTPサーバーは `` 127.0.0.1``インターフェースのみをlistenします。これは、リモートシステム上でサーバーを実行していて、ローカルシステムからWebブラウザーでアクセスしたい場合に問題になります。また、待機するTCPポート番号を8080に指定し、2番目の引数として渡します。最後の引数は `` app``オブジェクト(a:term: router)です。これは私たちが提供したいアプリケーションです。最後に、サーバーの `` serve_forever``メソッドを呼び出して、メインループを開始します。メインループでは、外部からの要求を待機します。
この行が呼び出されると、サーバはTCPポート8080でリッスンを開始します。サーバは要求を永遠に、あるいは少なくとも実行するプロセスを強制終了するまで(通常は `` Ctrl-C``を押して)それを起動するために使用した端末では `` Ctrl-Break``を実行します)。
参考文献¶
a:term: Configurator`オブジェクトのAPIの詳細については、:class:〜pyramid.config.Configurator`を参照してください。
:term: view configuration`の詳細については、:ref: view_config_chapter`を参照してください。