Python-WSGIインターフェース

Python WSGIは、主にさまざまなWebサーバー上のWebアプリケーションの移植性を促進するために、WebサーバーとPythonWebアプリケーションまたはWebフレームワークの間の標準インターフェイスを指定します。

上記の文は、公式のPythonPEP333標準から翻訳されています。[PEP333-Python Webサーバーゲートウェイインターフェイスv1.0](https://www.python.org/dev/peps/pep-0333/)

WSGIインターフェースの概要#

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サーバーは、Pythonに付属のwsgiref.simple_serverです。

コード

from wsgiref.simple_server import make_server
server =make_server('localhost',8080, application)
server.serve_forever()

Middleware

ミドルウェアは、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

Python-WSGIインターフェース