DIY Python フレームワーク: 1. WSGI の概要

このシリーズでは、Web フレームワークを自分で手動で構築する方法を学び、軽量フレームワーク web.py の実装を参照して、最も基本的な機能を簡略化して実現します。実装プロセスにおける Python のさまざまな機能について学びます。

この記事は自己学習のプロセスでもありますが、その前に、WSGI (Web Server Gateway Interface)、つまり Web サーバー ゲートウェイ インターフェイスとは何かについて説明します。WSGI は本質的に、Python で作成された Web アプリケーションを Web サーバーに接続できるように、Web サーバーが Python アプリケーションと対話する方法を定義する仕様です。仕様の詳細に興味がある場合は、PEP3333を確認してください。

なぜ WSGI が必要なのでしょうか?

Web 展開では通常、次のソリューションが採用されます。

  1. HTTP プロトコル レベルでのさまざまな関連タスクの処理専用の Web サーバーを展開します。
  2. 特定の言語(Java、PHP、Python...)で開発されたアプリケーションプログラムをデプロイすると、このプログラムはWebサーバーからクライアントリクエストを受け取り、処理後、Webサーバーに応答情報を返し、最終的にWebサーバー経由でクライアントに戻ります。 Webサーバー側。

このソリューションでは、Web サーバーとアプリケーション サーバー間の対話方法という問題を解決する必要があります。Web サーバーとアプリケーション プログラム間の対話を標準化するために、CGI 標準が初めて登場しました。WSGIはPython専用の標準であり、対話仕様の統一とプログラムの移植性の向上を目的とした仕様です。

WSGIはどのように機能しますか?

独自のフレームワークを試し始める前に、WSGI がどのように機能するかを理解しましょう。WSGI は、Web サーバーと Python アプリケーション間のブリッジを構築する方法を指定しており、このブリッジは次の 2 つの問題を解決します。

1. Web サーバーに Python アプリケーションの呼び出し方法を知らせ、アプリケーションにユーザーのリクエストを伝えます。
2. Python アプリケーションに、ユーザーの特定のリクエストとその結果を Web サーバーに返す方法を知らせます。

WSGI では 2 つの役割が定義されており、Web サーバー側はサーバーまたはゲートウェイと呼ばれ、アプリケーション側はアプリケーションまたはフレームワークと呼ばれます。以下では、サーバーとアプリケーションという用語を統一して使用します。一般的な呼び出しプロセスは次のとおりです: サーバー側は最初にユーザーのリクエストを受信し、仕様の要件に従ってアプリケーション側を呼び出します。呼び出しの結果は HTTP 応答にカプセル化されてクライアントに送信されます。 。以下の図を参照してください。

 分析例

まず、非常に単純なコード部分を見てみましょう。Python3 は単純なサーバー実装を提供します。

from wsgiref.simple_server import make_server

def application(env, start_response):
    response_body = ['%s: %s' % (k, v) for k, v in sorted(env.items())]
    response_body = '\n'.join(response_body).encode('utf-8')
    status = '200 OK'
    headers = [('Content-Type', 'text/plain'), 
               ('Content-Length', str(len(response_body)))]
    start_response(status, headers)
    return [response_body]
    
if __name__ == '__main__':
    server = make_server('localhost', 8080, application)
    server.serve_forever()
  1. make_server は、アプリケーション関数を使用してリクエストを処理する WSGI 準拠のサーバーを作成します。
  2. application 関数には 2 つのパラメータがあり、env はクライアント要求情報、さまざまなシステム パラメータ、およびサーバーの環境変数をカプセル化します。start_response は、make_server によって作成されたサーバーにステータス コードと応答のヘッダー情報を通知する役割を果たします。
  3. server.serve_forever() はサーバーを起動し、応答を永久に処理します。
  4. 注: 返されるコンテンツはバイト型である必要があるため、文字列は utf-8 形式でエンコードする必要があります。

プログラムを起動した後、ブラウザにhttp://localhost:8080/xxx/yyyと入力すると、次の応答が表示されます。

...
HTTP_HOST: localhost:8080
...
PATH_INFO: /xxx/yyy
...
wsgi.errors: <_io.TextIOWrapper name='<stderr>' mode='w'coding='utf-8'>
wsgi. file_wrapper: <class 'wsgiref.util.FileWrapper'>
wsgi.input: <_io.BufferedReader name=624>
wsgi.multiprocess: False
wsgi.multithread: False
wsgi.run_once: False
wsgi.url_scheme: http
wsgi.version: (1 、0)

おすすめ

転載: blog.csdn.net/panda_lin/article/details/121602514