ホームページ >テクノロジー周辺機器 >IT業界 >Python Webアプリケーション:WSGIの基本

Python Webアプリケーション:WSGIの基本

Joseph Gordon-Levitt
Joseph Gordon-Levittオリジナル
2025-02-18 11:40:08582ブラウズ

Python Webアプリケーション:WSGIの基本

キーテイクアウト

  • WSGI、またはWebサーバーゲートウェイインターフェイスは、すべてのPython Webフレームワークを支えており、異なるWebサーバーとアプリケーションフレームワーク間の相互作用を可能にするWebサーバーの共通の仕様を提供します。
  • WSGIアプリケーションは、環境(リクエストデータを含むPython Dict)とstart_fn(呼び出し可能)の2つの引数を受け入れる必要があるPythonコール可能です。アプリケーションは、ステータスコードとヘッダーのリストの2つの引数を持つstart_fnを呼び出し、応答ボディのバイトを含む反復可能なものを返します。 ミドルウェアを使用して、ミドルウェアとハ​​ンドラーがお互いを知る必要もハンドラーを使用して、WSGIアプリの機能を拡張できます。これにより、ロギングやエラー処理などの機能を簡単に追加できます。
  • WSGIアプリはさまざまな方法で提供できます。GunicornとUWSGIは2つの人気のあるオプションです。静的資産を提供するために、これらの前にnginxのようなものをセットアップすることをお勧めします。
  • Django、Flask、Bottle、およびその他すべてのPython Webフレームワークの下には、Webサーバーゲートウェイインターフェイス、または略してWSGIがあります。 WSGIは、ServletsがJavaにPythonすることです。これは、さまざまなWebサーバーとアプリケーションフレームワークが共通のAPIに基づいて対話できるようにするWebサーバーの共通の仕様です。ただし、ほとんどの点と同様に、Pythonバージョンはかなり単純です。
  • WSGIはPEP 3333で定義されています。
  • この記事では、アプリケーション開発者の観点からWSGI仕様を紹介し、WSGIと直接連携してアプリケーションを作成する方法を示します(希望する場合)。
最初のWSGIアプリPython Webアプリケーション:WSGIの基本

ここに可能な限り最も基本的なPython Webアプリがあります:

それだけです!ファイル全体。 app.pyと呼び、WSGI互換サーバーで実行すると、200ステータスのHello World Responseが表示されます。これにはGunicornを使用できます。 PIP(PIPインストールGunicorn)を介してインストールし、Gunicorn App:Appで実行します。このコマンドは、Gunicornに、アプリモジュールのアプリ変数からWSGIを呼び出すようにするように指示します。

今、あなたはかなり興奮するはずです。実行中のアプリケーションのためのわずか3行ですか?それは何らかのレコードでなければなりません(MOD_PHPが不正行為をしているため、PHPを除いて)。私はあなたがもっと知ることを希望しているに違いない。

では、WSGIアプリケーションの重要な部分は何ですか?

  • wsgiアプリケーションは、__call__メソッドを使用した関数、クラス、またはクラスインスタンスなど、python callable です。
  • 呼び出し可能なアプリケーションは、2つの引数を受け入れる必要があります。環境は、リクエストデータを含むPython Dictであり、start_fnはそれ自体が呼び出されます。
  • アプリケーションは、2つの引数を持つstart_fnを呼び出す必要があります:ステータスコード(文字列として)と2タプルとして表されるヘッダーのリスト。
  • アプリケーションは、応答本体のバイトを便利でストリーミング可能なチャンクで含む反復可能なものを返します。この場合、「Hello、World!」を含む文字列のリスト。 (アプリがクラスの場合、これは__iter__メソッドで達成できます。)
  • 例として、これらの次の2つの例は最初の例と同等です。

この情報を使用できる方法をすでに考えているかもしれませんが、おそらく最も関連性の高いものはミドルウェアを書くことです。

ジャズアップ
<span>def app(environ, start_fn):
</span>    start_fn<span>('200 OK', [('Content-Type', 'text/plain')])
</span>    <span>return ["Hello World!\n"]
</span>
<span>class app(object):
</span>
    <span>def __init__(self, environ, start_fn):
</span>        self<span>.environ = environ
</span>        self<span>.start_fn = start_fn
</span>
    <span>def __iter__(self):
</span>        self<span>.start_fn('200 OK', [('Content-Type', 'text/plain')])
</span>        <span>yield "Hello World!\n"
</span>
ミドルウェアは、WSGIアプリの機能を簡単に拡張する簡単な方法です。呼び出し可能なものだけを提供する必要があるため、他の機能にまとめることができます。 たとえば、

環境の内容を調べたいとしています。この例のように、これを行うためにミドルウェアを簡単に作成できます。

ここで、log_environは関数を返す関数であり、元のコールバックに延期する前に環境引数をきれいに印刷します。

このようにミドルウェアを書くことの利点は、ミドルウェアとハ​​ンドラーがお互いを知ることも気にする必要もないということです。たとえば、FlaskアプリはWSGIアプリであるため、Log_EnvironをFlaskアプリケーションに簡単にボルトで押し込むことができます。

他のいくつかの便利なミドルウェアのアイデア:

ビッグピラミッドをファイルの下部にしたくない場合は、一度に大量のミドルウェアを適用するためにRedimingを使用できます。
<span>class Application(object):
</span>    <span>def __call__(self, environ, start_fn):
</span>        start_fn<span>('200 OK', [('Content-Type', 'text/plain')])
</span>        <span>yield "Hello World!\n"
</span>
app <span>= Application()
</span>

start_fn引数を活用することにより、応答を変更するミドルウェアを作成することもできます。コンテンツタイプのヘッダーがテキスト/プレーンである場合、出力を逆転させるミドルウェアは次のとおりです。

start_fnの分離と応答のおかげでもう少し絡み合っていますが、それでも完全に実行可能です。 また、WSGIに厳密に仕様に準拠するには、応答の

close

メソッドを確認し、存在する場合は呼び出す必要があることに注意してください。レガシーWSGIアプリケーションは、ハンドラーを呼び出すときに反復可能ではなく、

書き込み
<span>import pprint
</span>

<span>def handler(environ, start_fn):
</span>    start_fn<span>('200 OK', [('Content-Type', 'text/plain')])
</span>    <span>return ["Hello World!\n"]
</span>

<span>def log_environ(handler):
</span>    <span>def _inner(environ, start_fn):
</span>        pprint<span>.pprint(environ)
</span>        <span>return handler(environ, start_fn)
</span>    <span>return _inner
</span>

app <span>= log_environ(handler)
</span>
関数を返すこともできます。ミドルウェアに古いアプリケーションをサポートしたい場合は、このケースを処理する必要がある場合があります。

生のWSGIで少し遊んでみると、Pythonが文字通り数十のWebフレームワークを持っている理由を理解し始めます。 WSGIは、ゼロから始めて何かを構築することを非常に簡単にします。たとえば、ルーティングの問題を検討している場合があります:

<span>import pprint
</span>

<span>def handle_error(handler):
</span>    <span>def _inner(environ, start_fn):
</span>        <span>try:
</span>            <span>return handler(environ, start_fn)
</span>        <span>except Exception as e:
</span>            <span>print e  # Log error
</span>            start_fn<span>('500 Server Error', [('Content-Type', 'text/plain')])
</span>            <span>return ['500 Server Error']
</span>    <span>return _inner
</span>

<span>def wrap_query_params(handler):
</span>    <span>def _inner(environ, start_fn):
</span>        qs <span>= environ.get('QUERY_STRING')
</span>        environ<span>['QUERY_PARAMS'] = urlparse.parse_qs(qs)
</span>        <span>return handler(environ, start_fn)
</span>    <span>return _inner
</span>

WSGIを直接操作することは、ライブラリを組み立てる柔軟性を

  • テンプレートライブラリ:好きなテンプレートライブラリ(jinja2、pystasheなど)をドロップして、ハンドラーからレンダリングされたテンプレートを返します!
  • ルートやWerkzeugのルーティングのようなライブラリを使用してルーティングを支援します。実際、WSGIを介してこれまでにない明るい抽象化を使用したい場合は、Werkzeugをご覧ください。
  • Flaskまたは同様のデータベース/移行ライブラリを使用してください。
  • もちろん、専門化されていないアプリケーションの場合、エッジケースが適切に処理されるようにするためにフレームワークを使用する必要があります。
しかし、サーバーはどうですか?

WSGIアプリを提供する方法はたくさんあります。私たちはすでにGunicornについて話しました。これはまともなオプションです。 UWSGIはもう1つの素晴らしいオプションです。静的資産を提供するために、これらの前にnginxのようなものをセットアップしてください。しっかりした出発点が必要です。

そしてそれだけです!

Python WebアプリケーションとWSGIに関するよくある質問(FAQ)

Python WebアプリケーションにおけるWSGIの役割は何ですか?

WSGI、またはWebサーバーゲートウェイインターフェイスは、WebサーバーとWebアプリケーションの標準インターフェイスです。 Python Webアプリケーションでは、アプリケーションとWebサーバーがお互いにリクエストを通信して送信できるため、重要な役割を果たしています。 WSGIはブリッジとして機能し、Webサーバーがクライアント(Webブラウザーなど)からWebアプリケーションにリクエストを転送できるようにします。次に、アプリケーションはリクエストを処理し、Webサーバーを介してクライアントに応答を送り返します。 Webサーバーは、Webアプリケーションと通信します。クライアントがWebサーバーにリクエストを送信すると、サーバーはWSGIインターフェイスを使用してその要求をWebアプリケーションに渡します。申請はリクエストを処理し、応答を返し、サーバーはクライアントに送り返します。このプロセスにより、特定の実装に関係なく、Webサーバーとアプリケーションが対話するための一貫した信頼できる方法が可能になります。 Pythonで利用でき、それぞれに独自の長所と短所があります。最も一般的に使用されるものには、Gunicorn、UWSGI、MOD_WSGIが含まれます。 Gunicornはそのシンプルさと使いやすさで知られていますが、UWSGIはその速度と効率で賞賛されています。一方、MOD_WSGIはApacheサーバーのモジュールであり、エンタープライズ環境でよく使用されます。

WSGIを使用してPython Webアプリケーションを展開するには、WSGIを使用してPython Webアプリケーションを展開するには、いくつかのステップが含まれます。まず、GunicornやUWSGIなどのWSGIサーバーをインストールする必要があります。次に、WSGIサーバーをアプリケーションにリクエストを処理するためのプロキシとして使用するようにWebサーバーを構成する必要があります。これには、サーバーの構成ファイルを変更して、必要なWSGI設定を含めることが含まれます。最後に、WSGIサーバーを起動して、アプリケーションのWSGIファイルに向ける必要があります。実際、Djangoには、Djangoプロジェクトの展開に使用できる組み込みのWSGIアプリケーションが付属しています。 Django WSGIアプリケーションは、DjangoプロジェクトとWebサーバーの間のブリッジとして機能し、リクエストと応答を通信および交換できるようにします。WSGIとASGIの違いは何ですか? ASGIはどちらもPython Webアプリケーションのインターフェイスですが、さまざまな目的を果たしています。 WSGIは、WebサーバーとWebアプリケーション間の通信を可能にする同期インターフェイスです。 ASGI、または非同期サーバーゲートウェイインターフェイスは、非同期操作をサポートするWSGIの拡張です。これは、ASGIでは、アプリケーションがブロックせずに複数のリクエストを同時に処理し、リアルタイムアプリケーションの方が効率的になることを意味します。 > PythonでWSGIアプリケーションを作成するには、環境辞書とstart_responseが呼び出すという2つの引数を受け入れる関数を定義します。環境辞書には、着信要求に関する情報が含まれていますが、start_response callableはリクエストへの応答を開始するために使用されます。あなたの関数は、応答の本文を生成する反復可能を返す必要があります。

Python WebアプリケーションでWSGIを使用することの利点は何ですか?まず、Webサーバーとアプリケーションの標準インターフェイスを提供し、Python Webアプリケーションの開発と展開を容易にします。第二に、さまざまなWSGI互換サーバーとアプリケーションから選択できるため、柔軟性を高めることができます。最後に、異なるサーバーとミドルウェアで同じWSGIアプリケーションを使用できるため、コードの再利用性を促進します。実際、FlaskアプリケーションはデフォルトではWSGIアプリケーションです。 Flaskアプリケーションを作成すると、実際にFlaskフレームワークが着信リクエストを処理して応答を送信するために使用するWSGIアプリケーションを作成します。

以上がPython Webアプリケーション:WSGIの基本の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。