WSGIを理解する

Dec 16, 2016 am 11:43 AM

Python Web 開発では、サーバー プログラムは 2 つの部分に分けることができます:

サーバー プログラム (クライアントから送信されたリクエストを受信して​​整理するために使用されます)

アプリケーション プログラム (サーバー プログラムによって渡されたリクエストを処理します)
アプリケーション開発時プログラミングの際、よく使われる機能をFlask、Django、Tornadoなどのさまざまなフレームワークにカプセル化します(Web開発で特定のフレームワークを使用することは、サーバーサイドのアプリケーションを開発し、バックグラウンドロジックを処理することに相当します)
ただし、サーバープログラムと連携することでユーザーにサービスを提供でき、異なるアプリケーション(異なるフレームワーク)は異なる機能や機能を持ちます。 現時点では、サーバー プログラムとアプリケーションの両方がこの標準をサポートできるようにするための標準が必要です。その後、この 2 つがうまく連携できるようになります。WSGI は、プロトコルに似た Python Web 開発の標準です。サーバープログラムとアプリケーションプログラムが相互に連携できるように、それぞれが使用するインターフェースや機能を規定した規約です

WSGIアプリケーションの規定の一部です

アプリケーションは呼び出し可能なオブジェクトです

呼び出し可能なオブジェクトには 3 つのタイプがあります:


関数


クラスは __call__() メソッドを実装する必要があります


クラスのインスタンス


このオブジェクトは 2 つのパラメータを受け取ります

ソース コードから、次のことがわかります。これら 2 つのパラメーターは、 environ 、 start_response です。 呼び出し可能なオブジェクトをクラスとして例にとると、


class application:

def __call__(self, environ, start_response):

pass


呼び出し可能なオブジェクトは、反復可能な値を返す必要があります。呼び出し可能なオブジェクトをクラスとして例に挙げます。

class application:

def __call__(self, environ, start_response):

return [xxx]


WSGI サーバー プログラムの規定の一部

サーバー プログラムには次のものが必要ですアプリケーションを呼び出す

DEF RUN (Application): #d

環境

Environment = {} #パラメータを設定

DEF Start_Response (xxx): #パラメータを設定
Pass
Result = Application (ENVIRON, Start_Response) # アプリケーションを呼び出す_ _call__ 関数 (ここではアプリケーションはクラスです)
def write(data):
def data in result: pass プログラムに必要なパラメーター
2. アプリケーションを呼び出します
3. アプリケーションの戻り結果に反復的にアクセスし、それを渡しますクライアントへ


ミドルウェア

ミドルウェアはサーバー プログラムとアプリケーションの間の部分であり、サーバー プログラムにとっては非常に重要であり、アプリケーションは透過的です。

サーバープログラムの場合、ミドルウェアはアプリケーションプログラムに偽装され、サーバープログラムに渡される必要があります。

アプリケーションプログラムの場合、ミドルウェアはサーバープログラムに偽装される必要があります。サーバー プログラムとして、アプリケーション プログラムを受け入れて呼び出します

サーバー プログラムは、クライアントによって要求された URL を取得し、処理のためにその URL をさまざまな関数に渡す必要があります。この機能は、ミドルウェアを使用して実装できます:


# URL ルーティング ミドルウェア。 def urlrouting(url_app_mapping):
defmidware_app(environ、start_response):#関数は呼び出され、2つのパラメーターを含み、繰り返しの値を返し、url = environ ['path_info'] 's' 's' s 's' s 's' s 's' s 's'の out out out out out out‐ out‐‐‐‐‐‐‐ 「」と一緒に使用します。 ‐‐‐‐‐‐‐そして

に呼ばれるように、











したがって、アプリケーションにとってはサーバー プログラムです
一方、midware_app 関数は 2 つのパラメーターを受け取る呼び出し可能オブジェクトであり、呼び出し可能オブジェクトは反復可能な値を返します。したがって、サーバー プログラムの場合、それはアプリケーションです

ミドルウェア (ミドルウェア) を作成するロジック:

1. ミドルウェアはアプリケーションとして偽装する必要があります—> WSGI アプリケーションの要件—> 1. 呼び出し可能 2. 2 つのパラメーター 3反復可能な値を返す🎜2. ミドルウェアはサーバー プログラムとして偽装する必要があります—> WSGI サーバー プログラムの要件—> アプリケーションを呼び出します。

私たちは変化する環境を理解する必要があります。 WSGI では、アプリケーションには environ と start_response という 2 つのパラメータが必要です。これらの 2 つのパラメータは、サーバー プログラムがアプリケーションを呼び出す前に設定する必要があります。 このうち、start_response は通常、呼び出し可能なメソッドであり、environ は CGI で定義されている辞書です。environ の定義については、CGI ドキュメントの Common Gateway Interface の仕様を確認してください。
以下は environ のパラメータです:

AUTH_TYPE
CONTENT_LENGTH #HTTP リクエストの Content-Length 部分
CONTENT_TYPE #HTTP リクエストの Content-Tpye 部分
GATEWAY_INTERFACE
HTTP_* #次のような一連の変数が含まれますHTTP_HOST、HTTP_ACCEPT など。
PATH_INFO #URL パスの最初の部分を除く残りの部分は、対応するアプリケーション オブジェクトを見つけるために使用されます。 要求されたパスがルート パスの場合、この値は空の文字列です。
PATH_TRANSLATED
QUERY_STRING #In URLパス?次の部分
REMOTE_ADDR
REMOTE_HOST
REMOTE_IDENT
REMOTE_USER
REQUEST_METHOD #「GET」、「POST」などのHTTPリクエストメソッド
SCRipT_NAME #アプリケーションオブジェクトがURLパスの開始部分に対応する場合、アプリケーションオブジェクトサーバーのルート、この値は空の文字列にすることができます
SERVER_NAME
SERVER_PORT
SERVER_PROTOCOL #クライアントによって要求されたプロトコル (HTTP/1.1 HTTP/1.0)
SERVER_SOFTWARE

例: http://localhost:5000/aaa? 666、変数値は:

REQUEST_METHOD='GET'
SCRIPT_NAME=''
SERVER_NAME='localhost'
SERVER_PORT='5000'
PATH_INFO='/aaa'
QUERY_STRING='666'
SERVER_PROTOCOL='HTTP/ 1.1'
CONTENT_TYPE=' text/plain'
CONTEN_LENGTH=''

HTTP_HOST = 'localhost:8000'
HTTP_ACCEPT = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp, */*;q= 0.8'
HTTP_ACCEPT_ENCODING = 'gzip,deflate,sdch'
HTTP_ACCEPT_LANGUAGE = 'en-US,en;q=0.8,zh;q=0.6,zh-CN;q=0.4,zh-TW; q=0.2'
HTTP_CONNECTION = 'キープアライブ'
HTTP_USER_AGENT = 'Mozilla/5.0 (X11; linux i686) AppleWebKit/537.36 (Gecko のような KHTML) Chrome/32.0.1700.77 Safari/537.36'

start_response() の場合関数:
start_response は HTTP 応答の始まり、その形式は次のとおりです: start_response(status, response_headers, exc_info=None)
status は 200 OK などの HTTP ステータス コードを表します
response_headers はリストであり、リスト要素はタプル: (header_name, header_value)
exc_info はオプションのパラメータです。リクエストの処理中にエラーが発生した場合、このパラメータが設定され、同時に start_response が呼び出されます。私が少し改良した werkzeug の公式ドキュメントから例を見てみましょう。これは分析用です (wsgi.py を 2 番目に読んだ後にこの段落を読むことをお勧めします。SharedDataMiddleware クラスの一部をもう一度参照してください):

class Shortly(object):


def __init__(self, config):
self.redis = redis .Redis(config['redis_host'], config['redis_port'])

defdispatch_request(self, request):
return Response('Hello World!') #Response クラスを初期化します

def wsgi_app(self, environ , start_response):
request = Request(environ)
res ponse = self.dispatch_request(request ) #Response タイプは応答クラスです
Print ('%%%%%owventage%%%%owventage. Response の __call__ 関数はアプリケーション、反復オブジェクトを返します

def __call__(self, environ, start_response):
print(self.wsgi_app)
print('erghrgheoghegoierge')
return self. wsgi_app(environ, start_response)
EDef Create_app (redis_host = ' localhost'、redis_port = 6379、with_Static = TRUE):
app = shortly ({
'redis_host': redis_host,
'redis_p Ort ': Redis_port
})
if with_static:
Print (' yes')
app.wsgi_app = SharedDataMiddleware(app.wsgi_app, {
app
#ローカルサーバーを開きます
if __name__ == '__main__':
from werkzeug.serv ing import run_simple
app = create_app() #アプリケーションのインスタンスを作成します
run_simple('127.0.0.1', 5000, app, use_debugger =True, use_reloader=True)

Response のソース コードを見ると (Response は BaseResponse を継承します。BaseResponse のソース コードを見てください)、関数dispatch_request() によって返される値が Request のコンストラクターである、つまり Response クラスがwsgi_app()関数では、request 値の型はResponseなので、wsgi_app()の戻り値response(environ,start_response)は実際にはResponseクラスの__call__()関数を呼び出します。
ソース コードを確認すると、__call__() が WSGI アプリケーションであることがわかります。

このプログラムを実行する場合:

22222222222222222
はい
333333333333333
* http://127.0.0.1:5000/ で実行中 (終了するには CTRL+C を押します)
* stat
2222222 で再起動します2222222222
はい
33333333333333333

なぜ二度読まれたのかは気にしないでください。
この Web ページを開くと、コンソールの出力は次のようになります:

#wsgi_app が SharedDataMiddleware のインスタンスであることを説明します。
erghrgheoghegoierge
%%%%%%%%%%%%%%%%%%%%%%%% #元の wsgi_app 関数の内容が実行されることを示します。
127.0.0.1 - - [22/May/2015 21:01:25] "GET / HTTP/1.1" 200 -

この例では、app.wsgi_app メソッドが SharedDataMiddleware クラスのインスタンスになっていることがわかります。サーバーが environ と start_response をアプリに渡した後も、wsgi_pp が元の wsgi_app のコンテンツを実行する理由について非常に興味があります。
ホスト アドレスにアクセスすると、サーバー プログラムはユーザーのリクエストを受け入れ、environ と start_response をアプリケーション アプリに渡します。その中で app.wsgi_app 関数が実行されます。 次に、wsgi_app は ShareDataMiddleware の __call__() 関数を実行します。ここでは、SharedDataMiddleware クラスの __call__() のソース コードを確認する必要があります。ソース コードを確認すると、ユーザーが静的ファイルを要求していないため、return self.app(environ, start_response) が実行されることがわかります。この例では、create_app() で ShareDataMiddleware アプリケーションが実行されていることがわかります。定義したのは app.wsgi_app なので、ここで返されるのは元の wsgi_app 関数です。もちろん、元の関数が実行されます~
同時に、静的フォルダーにファイルを置き、127.0.0.1/static/filename にアクセスしてみると、ファイルが表示されるようになります。
この例を通じて、ミドルウェアの役割をより深く理解することができます。

ミドルウェアはサーバー プログラムとアプリケーション プログラムの間にあり、サーバー (environ および

start_response) からメッセージを受信し、特定の処理を実行します。次に、アプリケーションに加えて処理する必要がある部品を加えて、サーバープログラムもWSGI関連の変数を定義する必要があります。 wsgi.erros .multithread
アプリケーションオブジェクトを同時に呼び出すことができる場合同じプロセス内の別のスレッドによって、この値は True
wsgi.multiprocess

アプリケーション オブジェクトを別のプロセスによって同時に呼び出すことができる場合、この値は True

wsgi .run_once

If サーバーは、アプリケーション オブジェクトがそれを含むプロセスで 1 回だけ呼び出されることを望んでいる場合、この値は True になります



上記は WSGI が理解する内容です。その他の関連記事については、PHP 中国語に注意してください。ウェブサイト (www.php.cn)!




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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Pythonを使用してテキストファイルのZIPF配布を見つける方法 Pythonを使用してテキストファイルのZIPF配布を見つける方法 Mar 05, 2025 am 09:58 AM

このチュートリアルでは、Pythonを使用してZIPFの法則の統計的概念を処理する方法を示し、法律の処理時にPythonの読み取りおよび並べ替えの効率性を示します。 ZIPF分布という用語が何を意味するのか疑問に思うかもしれません。この用語を理解するには、まずZIPFの法律を定義する必要があります。心配しないでください、私は指示を簡素化しようとします。 ZIPFの法則 ZIPFの法則は単に意味します。大きな自然言語のコーパスでは、最も頻繁に発生する単語は、2番目の頻繁な単語のほぼ2倍の頻度で表示されます。 例を見てみましょう。アメリカ英語の茶色のコーパスを見ると、最も頻繁な言葉は「thであることに気付くでしょう。

HTMLを解析するために美しいスープを使用するにはどうすればよいですか? HTMLを解析するために美しいスープを使用するにはどうすればよいですか? Mar 10, 2025 pm 06:54 PM

この記事では、Pythonライブラリである美しいスープを使用してHTMLを解析する方法について説明します。 find()、find_all()、select()、およびget_text()などの一般的な方法は、データ抽出、多様なHTML構造とエラーの処理、および代替案(SEL

Pythonでの画像フィルタリング Pythonでの画像フィルタリング Mar 03, 2025 am 09:44 AM

ノイズの多い画像を扱うことは、特に携帯電話や低解像度のカメラの写真でよくある問題です。 このチュートリアルでは、OpenCVを使用してPythonの画像フィルタリング手法を調査して、この問題に取り組みます。 画像フィルタリング:強力なツール 画像フィルター

Pythonを使用してPDFドキュメントの操作方法 Pythonを使用してPDFドキュメントの操作方法 Mar 02, 2025 am 09:54 AM

PDFファイルは、クロスプラットフォームの互換性に人気があり、オペレーティングシステム、読み取りデバイス、ソフトウェア間でコンテンツとレイアウトが一貫しています。ただし、Python Plansing Plain Text Filesとは異なり、PDFファイルは、より複雑な構造を持つバイナリファイルであり、フォント、色、画像などの要素を含んでいます。 幸いなことに、Pythonの外部モジュールでPDFファイルを処理することは難しくありません。この記事では、PYPDF2モジュールを使用して、PDFファイルを開き、ページを印刷し、テキストを抽出する方法を示します。 PDFファイルの作成と編集については、私からの別のチュートリアルを参照してください。 準備 コアは、外部モジュールPYPDF2を使用することにあります。まず、PIPを使用してインストールします。 ピップはpです

DjangoアプリケーションでRedisを使用してキャッシュする方法 DjangoアプリケーションでRedisを使用してキャッシュする方法 Mar 02, 2025 am 10:10 AM

このチュートリアルでは、Redisキャッシングを活用して、特にDjangoフレームワーク内でPythonアプリケーションのパフォーマンスを向上させる方法を示しています。 Redisのインストール、Django構成、およびパフォーマンスの比較をカバーして、Beneを強調します

TensorflowまたはPytorchで深い学習を実行する方法は? TensorflowまたはPytorchで深い学習を実行する方法は? Mar 10, 2025 pm 06:52 PM

この記事では、深い学習のためにTensorflowとPytorchを比較しています。 関連する手順、データの準備、モデルの構築、トレーニング、評価、展開について詳しく説明しています。 特に計算グラップに関して、フレームワーク間の重要な違い

Pythonの並列および同時プログラミングの紹介 Pythonの並列および同時プログラミングの紹介 Mar 03, 2025 am 10:32 AM

データサイエンスと処理のお気に入りであるPythonは、高性能コンピューティングのための豊富なエコシステムを提供します。ただし、Pythonの並列プログラミングは、独自の課題を提示します。このチュートリアルでは、これらの課題を調査し、グローバルな承認に焦点を当てています

Pythonで独自のデータ構造を実装する方法 Pythonで独自のデータ構造を実装する方法 Mar 03, 2025 am 09:28 AM

このチュートリアルでは、Python 3にカスタムパイプラインデータ構造を作成し、機能を強化するためにクラスとオペレーターのオーバーロードを活用していることを示しています。 パイプラインの柔軟性は、一連の機能をデータセットに適用する能力にあります。

See all articles