Python WSGIは、主にさまざまなWebサーバー上のWebアプリケーションの移植性を促進するために、WebサーバーとPythonWebアプリケーションまたはWebフレームワークの間の標準インターフェイスを指定します。
上記の文は、公式のPythonPEP333標準から翻訳されています。[PEP333-Python Webサーバーゲートウェイインターフェイスv1.0](https://www.python.org/dev/peps/pep-0333/)
WSGIの意味:Webサーバーゲートウェイインターフェイス(Webサーバーネットワーク管理インターフェイス)。
WSGIインターフェイスには、サーバー/ゲートウェイ側とアプリケーション/フレームワーク側の2つの側面があります。サーバーとアプリケーションは、ゲートウェイとフレームワークを使用する代わりに、後で説明するために直接使用されます。サーバー側は、アプリケーション側から提供された呼び出し可能オブジェクトを直接呼び出します。さらに、サーバーとアプリケーションの間にミドルウェアと呼ばれる一種のミドルウェアが存在する可能性があります。ミドルウェアはサーバー用のアプリケーションですが、ミドルウェアはアプリケーション用のサーバーです。
上記の呼び出し可能オブジェクトは、 __call__メソッドを持つ関数、メソッド、クラス、またはインスタンスを指します。
アプリケーション側、サーバー側、ミドルウェアの3つの部分は次のとおりです。
関数、メソッド、クラス、および呼び出し可能なメソッドを持つインスタンスなどの呼び出し可能なオブジェクトはすべて、アプリケーションオブジェクトとして使用できます。アプリケーションオブジェクトは2つのパラメータを受け入れ、複数回呼び出すことができます。
パラメータ
start_responseの3つのパラメーターの意味は次のとおりです。
response_headers =[('Content-Type','text/plain'),('Content-Length',str(len(response_body)))]
戻り値
アプリケーションオブジェクトは、strのリストの形式で応答本文を返す必要があります。これは、戻り値が1つ以上の文字列のリストであることを意味します。
以下は、アプリケーションオブジェクトとしての関数の例です。
def simple_app(environ, start_response):"""最も単純なアプリケーションオブジェクト"""
status ='200 OK'
response_headers =[('Content-type','text/plain')]start_response(status, response_headers)return['Hello world!\n']
以下は、アプリケーションオブジェクトとしてのクラスの例です。
classAppClass:"""
AppClass()AppClassクラスオブジェクトをアプリケーションとして返し、反復時に呼び出されます__iter__メソッド、そしてあなたは同じ出力を生成することができます。
私たちも達成できれば__call__このメソッドは、インスタンスをアプリケーションとして直接扱います
"""
def __init__(self, environ, start_response):
self.environ = environ
self.start = start_response
def __iter__(self):
status ='200 OK'
response_headers =[('Content-type','text/plain')]
self.start(status, response_headers)yield"Hello world!\n"
WSGIサーバーはアプリケーションを呼び出し、positionalパラメーターを使用してアプリケーションを呼び出す必要があります。同時に、アプリケーションプロトコルの要件から次のことがわかります。
WSGIサーバーは、アプリケーションに環境パラメーターを提供する必要があるため、環境パラメーター自体を取得できる必要があります。
WSGIサーバーは、アプリケーションの戻り値を応答本文として受け取ります。
最も単純なWSGIサーバーは、Pythonに付属のwsgiref.simple_serverです。
コード
from wsgiref.simple_server import make_server
server =make_server('localhost',8080, application)
server.serve_forever()
ミドルウェアは、WSGIサーバーとWSGIアプリケーションの間にあります。ミドルウェアに関するコードリファレンスの一部:
コードは以下のように表示されます
from wsgiref.simple_server import make_server
def application(environ, start_response):
response_body ='hello world!'
status ='200 OK'
response_headers =[('Content-Type','text/plain'),('Content-Length',str(len(response_body)))]start_response(status, response_headers)return[response_body]
# ミドルウェア
classUpperware:
def __init__(self, app):
self.wrapped_app = app
def __call__(self, environ, start_response):for data in self.wrapped_app(environ, start_response):yield data.upper()
wrapped_app =Upperware(application)
httpd =make_server('localhost',8051, wrapped_app)
httpd.serve_forever()
print 'end'
Recommended Posts