ホームページ >バックエンド開発 >Python チュートリアル >WSGIを理解する
Python Web 開発では、サーバー プログラムは 2 つの部分に分けることができます:
サーバー プログラム (クライアントから送信されたリクエストを受信して整理するために使用されます)
アプリケーション プログラム (サーバー プログラムによって渡されたリクエストを処理します)
アプリケーション開発時プログラミングの際、よく使われる機能をFlask、Django、Tornadoなどのさまざまなフレームワークにカプセル化します(Web開発で特定のフレームワークを使用することは、サーバーサイドのアプリケーションを開発し、バックグラウンドロジックを処理することに相当します)
ただし、サーバープログラムと連携することでユーザーにサービスを提供でき、異なるアプリケーション(異なるフレームワーク)は異なる機能や機能を持ちます。 現時点では、サーバー プログラムとアプリケーションの両方がこの標準をサポートできるようにするための標準が必要です。その後、この 2 つがうまく連携できるようになります。WSGI は、プロトコルに似た Python Web 開発の標準です。サーバープログラムとアプリケーションプログラムが相互に連携できるように、それぞれが使用するインターフェースや機能を規定した規約です
WSGIアプリケーションの規定の一部です
アプリケーションは呼び出し可能なオブジェクトです
呼び出し可能なオブジェクトには 3 つのタイプがあります:
関数
クラスは __call__() メソッドを実装する必要があります
クラスのインスタンス
このオブジェクトは 2 つのパラメータを受け取ります
class application:
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 つのパラメーターを受け取る呼び出し可能オブジェクトであり、呼び出し可能オブジェクトは反復可能な値を返します。したがって、サーバー プログラムの場合、それはアプリケーションです
ミドルウェア (ミドルウェア) を作成するロジック:
私たちは変化する環境を理解する必要があります。 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 クラスの一部をもう一度参照してください):
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 ページを開くと、コンソールの出力は次のようになります:
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 にアクセスしてみると、ファイルが表示されるようになります。
この例を通じて、ミドルウェアの役割をより深く理解することができます。
start_response) からメッセージを受信し、特定の処理を実行します。次に、アプリケーションに加えて処理する必要がある部品を加えて、サーバープログラムもWSGI関連の変数を定義する必要があります。 wsgi.erros .multithread
アプリケーションオブジェクトを同時に呼び出すことができる場合同じプロセス内の別のスレッドによって、この値は True
wsgi.multiprocess
wsgi .run_once
If サーバーは、アプリケーション オブジェクトがそれを含むプロセスで 1 回だけ呼び出されることを望んでいる場合、この値は True になります
上記は WSGI が理解する内容です。その他の関連記事については、PHP 中国語に注意してください。ウェブサイト (www.php.cn)!