Python学習-WSGIインターフェース

HTTPプロトコルとHTMLドキュメントを知っていると、Webアプリケーションの本質は次のとおりであることを実際に理解しています。

  1. ブラウザはHTTPリクエストを送信します。
  2. サーバーはリクエストを受信し、HTMLドキュメントを生成します
  3. サーバーは、HTMLドキュメントをHTTP応答の本文としてブラウザーに送信します。
  4. ブラウザはHTTP応答を受信し、HTTPボディからHTMLドキュメントをフェッチして表示します。

したがって、最も単純なWebアプリケーションは、最初にHTMLをファイルに保存し、既製のHTTPサーバーソフトウェアを使用してユーザー要求を受信し、ファイルからHTMLを読み取って、戻ることです。Apache、Nginx、Lighttpdなどの一般的な静的サーバーがこれを行います。

HTMLを動的に生成する場合は、上記の手順を自分で実装する必要があります。ただし、HTTPリクエストの受け入れ、HTTPリクエストの解析、HTTPレスポンスの送信はすべて大変な作業です。これらの低レベルのコードを自分で作成する場合、ダイナミックHTMLの作成を開始する前に、HTTP仕様を読むのに数か月を費やす必要があります。

正しいアプローチは、基盤となるコードが専用サーバーソフトウェアによって実装され、Pythonを使用してHTMLドキュメントの生成に集中することです私たちは、TCP接続へのアクセス、元のHTTPリクエストとレスポンスのフォーマット、そうしたくないので統一されたインタフェースの必要性を私たちは、Pythonを使用してWebサービスを書くことに集中しましょう。

このインターフェイスはWSGI:Web Server GatewayInterfaceです。

WSGIインターフェースの定義は非常に単純で、Web開発者はHTTP要求に応答する関数を実装するだけで済みます。「Hello、web!」の最も単純なWebバージョンを見てみましょう。

def applicaion(environ, start_response):
	start_response('200 OK', [('Content-Type', 'text/html')])
	return [b'<h1>Hello, web!</h1>']

上記のapplication()関数は、WSGI標準に準拠するHTTP処理関数であり、次の2つのパラメーターを受け取ります。

  • environ:すべてのHTTPリクエスト情報を含むdictオブジェクト;
  • start_response:HTTP応答を送信する関数。

application()関数で、次を呼び出します。

start_response('200 OK', [('Content-Type', 'text/html')])

HTTP応答のヘッダーが送信されます。ヘッダーの送信は1回のみ、つまりstart_response()関数の呼び出しは1回のみであることに注意してください。start_response()関数は2つのパラメーターを受け取ります。1つはHTTP応答コードで、もう1つはHTTP応答コードです。もう1つは、リストで表されるHTTPヘッダーです。各ヘッダーは、2つのstrを含むタプルで表されます。

通常、Content-Typeヘッダーはブラウザに送信する必要があります。他の多くの一般的に使用されるHTTPヘッダーも送信する必要があります。

次に、関数b 'の戻り値

こんにちは、ウェブ!

'本文をHTTP応答としてブラウザに送信します。

WSGIで懸念しているのは、dictオブジェクト環境からHTTPリクエスト情報を取得し、HTMLを構築し、start_response()を介してヘッダーを送信し、最後にBodyを返す方法です。

application()関数全体には、HTTPの解析の一部は含まれていません。つまり、基になるコードを自分で作成する必要はなく、より高いレベルで要求に応答する方法を検討する責任があります。

しかし、待ってください、このapplication()関数はどのように呼び出されますか?自分で呼び出すと、environとstart_responseの2つのパラメーターを指定できず、返されたバイトをブラウザーに送信できません。

したがって、application()関数はWSGIサーバーによって呼び出される必要があります。WSGI仕様に準拠するサーバーは多数ありますが、使用するサーバーを1つ選択できます。ただし、今のところ、作成したapplication()関数が実際にブラウザーにHTMLを出力できることをできるだけ早くテストしたいので、Webアプリケーションを実行するための最も単純なWSGIサーバーをすばやく見つける必要があります。

幸いなことに、PythonにはWSGIサーバーが組み込まれています。このモジュールはwsgirefと呼ばれ、純粋なPythonで記述されたWSGIサーバーのリファレンス実装ですいわゆる「リファレンス実装」とは、実装がWSGI標準に完全に準拠しいることを意味しますが、運用効率は考慮されておらず、開発とテストのみを目的としています。

WSGIサービスを実行する

まず、WebアプリケーションのWSGI処理機能を実装するためにhello.pyを記述します。

# hello.py

def application(environ, start_response):
	start_response('200 OK', [('Content-Type', 'text/html')])
    return [b'<h1>Hello, web!</h1>']

次に、WSGIサーバーの起動とapplication()関数のロードを担当する別のserver.pyを記述します。

# server.py
# 从wsgiref模块导入:
from wsgiref.simple_server import make_server
# 导入我们自己编写的application函数:
from hello import application

# 创建一个服务器,IP地址为空,端口是8000,处理函数是application:
httpd = make_server('', 8000, application)
print('Serving HTTP on port 8000...')
# 开始监听HTTP请求:
httpd.serve_forever()

上記の2つのファイルが同じディレクトリにあることを確認してから、コマンドラインでpython server.pyと入力して、WSGIサーバーを起動します。
ここに画像の説明を挿入
注:ポート8000​​がすでに他のプログラムによって占有されている場合、起動は失敗します。変更してください。別のポートに。

起動が成功したら、ブラウザを開いてhttp:// localhost:8000 /と入力すると、結果が表示されます。
ここに画像の説明を挿入

コマンドラインでwsgirefによって出力されたログ情報を確認できます。
ここに画像の説明を挿入

Ctrl + Cを押してサーバーを終了します。

このWebアプリケーションが単純すぎると思われる場合は、少し変更してenvironからPATH_INFOを読み取り、より動的なコンテンツを表示できます。

# hello.py

def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    body = '<h1>Hello, %s!</h1>' % (environ['PATH_INFO'][1:] or 'web')
    return [body.encode('utf-8')]

URLの一部としてユーザー名をアドレスバーに入力すると、Hello、xxx!が返されます。
ここに画像の説明を挿入

Webアプリのように感じますか?

概要

Webアプリケーションがどれほど複雑であっても、エントリポイントはWSGI処理機能です。HTTPリクエストのすべての入力情報はenvironを介して取得でき、HTTPレスポンスの出力は、start_response()と関数の戻り値によって本文として使用できます。

複雑なWebアプリケーションの場合、WSGI機能だけを扱うには低レベルです。Web開発をさらに簡素化するには、WSGIの上にWebフレームワークを抽象化する必要があります。

おすすめ

転載: blog.csdn.net/qq_44787943/article/details/112620154