Pythonのウェブを開発する際、最後にそれが何であるかをWSGIので、WSGIは、多くの場合、発生しましたか?本論文では、一緒に謎のベール明らかにWSGI!
初めて目にWSGI紹介:
フルネームPythonのWebサーバーゲートウェイインターフェイスは、Webサーバの範囲で、Webアプリケーションの移植性を向上させるために、WebサーバとPython WebアプリケーションまたはWebフレームワークとの間の標準インタフェースを指定します。表示するには、特定の公式ドキュメントを
上記の説明から、我々は見ることができます:
- WSGIインタフェース規格は、プロトコル/仕様です。
- コミュニケーション(アクション)は、WebサーバとPython Webアプリケーション間の間隔です。
- 目的は、異なるPythonプログラムをすることができ異なるWebサーバー間の相互通信を確保するための標準を開発することです
あなたは求めることができる、なぜWSGI?
まず、我々は要求を処理するために、特定のプロセスのWebアプリケーションのいくつかを識別します。
- ユーザーは、ブラウザがリクエストを送信する動作します。
- 対応するWebサーバに要求を転送します
- Webサーバは、Webアプリケーション、Webアプリケーションの処理要求に要求を転送します
- WebサーバへのWebアプリケーションの要求は、ユーザー結果に応じて、Webサーバから返された結果を返します
- ブラウザは、応答、ショーのユーザーを受け取ります
Webサーバーは、Webアプリケーションの要求と通信する必要があることが分かるが、多くのWebサーバは、ああ、PythonのWebアプリケーション開発フレームワークはまた、WSGIが登場して、通信規格のセットを定義し、ああ、より対応があります。想像し、そうでない場合は統一規格、それはフレームワークのWebプレゼンスとWebサーバーのデータを一致させることができないだろうし、開発者が明らかに不合理である、制限されます。
標準、その後の定義以来WSGI基準や規範?
Webサーバ、Webアプリケーションへの要求の前に、あなたはフォーマット指定WSGIに最初のHTTPメッセージに必要です。
WSGIの規定は、Webプログラムを呼び出し可能と2つのパラメータを受け入れることを呼び出し可能、反復可能な返している必要があります。
- 環境:辞書、要求されたすべての情報が含まれています
- start_responseを:などの呼び出し可能な関数オブジェクトで呼び出し、状態パラメータコードを含む応答を開始するために、ヘッダ、
以上の検討を経て、一緒にシンプルなWSGIサービスバーの実現
まず、我々はWSGI標準に沿ったもので、A HTTPハンドラを記述します。
def hello(environ, start_response):
status = "200 OK"
response_headers = [('Content-Type', 'text/html')]
start_response(status, response_headers)
path = environ['PATH_INFO'][1:] or 'hello'
return [b'<h1> %s </h1>' % path.encode()]
この方法は、環境辞書PATH_INFOを取得する責任があり、その後、ショーのフロントエンドを要求パスを取得しています。
次に、我々は、ビルトインのPython WSGIサーバーモジュールwsgiref、書き込みserver.pyを使用して、プロセス・サーバーの認証に使用さWSGIサーバを起動する必要があります。
# coding:utf-8
"""
desc: WSGI服务器实现
"""
from wsgiref.simple_server import make_server
from learn_wsgi.client import hello
def main():
server = make_server('localhost', 8001, hello)
print('Serving HTTP on port 8001...')
server.serve_forever()
if __name__ == '__main__':
main()
"ブラウザを開き、Pythonのserver.pyを実行HTTP:// localhostを:8001 / Aは "、検証することができます。
シンプルなWSGIサービスを実装することによって、私たちが見ることができます:httpは環境によって要求されたすべての情報を得ることができ、HTTPレスポンスデータは、start_responseをプラス体としての関数の戻り値を介して使用できます。
もちろん、より単純な場合よりも、その後、内部のWebフレームワークのpython WSGI仕様は、それに従うことをどのようにでしょうか?フラスコの例では、
フラスコとWSGI
__call__メソッドを達成呼び出されたときフラスコアプリでプログラムの例としては、私たちはクラスフラスコアプリのインスタンスを呼び出し可能に作成され、__ call__方法は、WSGI要求と応答の処理を完了しwsgi_app()メソッドを呼び出し、この方法は、着信要求のデータは、データへのアクセスが返され、サーバーによって呼び出されます。
def wsgi_app(self, environ, start_response):
ctx = self.request_context(environ)
error = None
try:
try:
ctx.push()
response = self.full_dispatch_request()
except Exception as e:
error = e
response = self.handle_exception(e)
except: # noqa: B001
error = sys.exc_info()[1]
raise
return response(environ, start_response)
finally:
if self.should_ignore_error(error):
error = None
ctx.auto_pop(error)
def __call__(self, environ, start_response):
return self.wsgi_app(environ, start_response)
WERKZEUGライブラリのフラスコは非常に良いWSGIツールライブラリで、その後、私たちの詳細な研究の具体的な実施後。
上記。