目次
![
Application
Server
ホームページ バックエンド開発 Python チュートリアル WSGI とは何かを理解する必要があります

WSGI とは何かを理解する必要があります

Nov 10, 2020 pm 05:01 PM

Python ビデオ チュートリアル コラムでは WSGI を紹介します。

WSGI とは何かを理解する必要があります

私は数年間 Python Web を書いてきましたが、WSGI が何なのか、WSGI にたくさんの人がいるのかどうかはまだわかりません。開発者として Web サイトを構築するために wsgi が何であるかを理解する必要はほとんどないため、これは正常です。

しかし、Web フレームワークを自分で書きたい場合は、wsgi を理解する必要があります。

復習すると、Web 開発に Python を使用する場合、通常、Django や flask などの特定の Web フレームワークやその他のフレームワークに基づいて開発します。ビジネス開発が完了したら、外部アクセスを提供するためにサーバーに展開する必要があります。

現時点でオンラインで検索すると、デプロイするには gunicorn または uwsgi を使用する必要があることがわかります。それでは、gunicorn と uwsgi とは何ですか?

この写真を見れば分かります。インターネットから写真を見つけました。

ここでの uwsgi または gunicorn の役割は、 Web サーバー。ここでのサーバーはソフトウェア レベルのサーバーであり、ブラウザーから送信された HTTP リクエストを処理し、応答結果をフロントエンドに返すために使用されます。 Web フレームワークの主なタスクは、ビジネス ロジックを処理して結果を Web サーバーに生成し、Web サーバーがその結果をブラウザーに返すことです。

Web フレームワークと Web サーバー間の通信は、一連の仕様に従う必要があります。この仕様は WSGI です。

なぜこのような一連の規制を考え出す必要があるのでしょうか?標準は、標準を統一し、誰もが使いやすくするためのものです。

携帯電話の充電インターフェイスが Type-c になったと想像してください。Type-c は標準です。携帯電話メーカーは、この標準に従って携帯電話と充電器を製造しています。メーカーは、 Type-c 仕様に準拠した充電器を使用でき、さまざまなメーカーの携帯電話をさまざまなメーカーの充電器で使用できます。ただし、Apple には独自の規制があり、最終的には Android 充電器が Apple を充電できなくなります。

![

](p9-juejin.bytaimg.com/tos-cn-i-k3…)

WSGI 仕様に準拠したアプリケーションの作成方法(フレームワークの) プログラムとサーバーはどうですか?

上の図に示すように、左側は Web サーバー、右側は Web フレームワークまたはアプリケーションです。

Application

WSGI では、アプリケーションが呼び出し可能なオブジェクトである必要があると規定しています (呼び出し可能なオブジェクトは、関数、クラス、または __call__ インスタンス オブジェクトを実装するオブジェクトにすることができます)。 2 つのパラメータを受け入れる必要があり、オブジェクトの戻り値は反復可能なオブジェクトである必要があります。

アプリケーションの最も単純な例を書くことができます

HELLO_WORLD = b"Hello world!\n"def application(environ, start_response):
    status = '200 OK'
    response_headers = [('Content-type', 'text/plain')]
    start_response(status, response_headers)    return [HELLO_WORLD]复制代码
ログイン後にコピー

アプリケーションは関数であり、呼び出し可能なオブジェクトである必要があり、2 つのパラメーターを受け取ります。2 つのパラメーターは environ と start_response

  • environ は、ヘッダー、リクエスト パラメーターなど、HTTP リクエストに関連するすべてのコンテンツを保存するディクショナリです。
  • start_response は、WSGI サーバーによって渡される関数で、レスポンス ヘッダーに使用されます。 、ステータスコードがサーバーに渡されます。

start_response 関数の呼び出しは、応答ヘッダーとステータス コードをサーバーに渡す役割を果たします。応答本文は、アプリケーション関数によってサーバーに返されます。完全な http 応答は、これら 2 つの関数によって提供されます。

wsgi を実装する Web フレームワークには、このような呼び出し可能なオブジェクトがあります。

Server

WSGI サーバーが行うことは、毎回 HTTP リクエストを受信し、environ オブジェクトを構築することです。次にアプリケーション オブジェクトを呼び出し、最後に HTTP 応答をブラウザに返します。

以下は完全な wsgi サーバーのコードです

import socketimport sysfrom io import StringIOclass WSGIServer(object):
    address_family = socket.AF_INET
    socket_type = socket.SOCK_STREAM
    request_queue_size = 1

    def __init__(self, server_address):
        # Create a listening socket
        self.listen_socket = listen_socket = socket.socket(
            self.address_family,
            self.socket_type
        )        # Allow to reuse the same address
        listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)        # Bind
        listen_socket.bind(server_address)        # Activate
        listen_socket.listen(self.request_queue_size)        # Get server host name and port
        host, port = self.listen_socket.getsockname()[:2]
        self.server_name = socket.getfqdn(host)
        self.server_port = port        # Return headers set by Web framework/Web application
        self.headers_set = []    def set_app(self, application):
        self.application = application    def serve_forever(self):
        listen_socket = self.listen_socket        while True:            # New client connection
            self.client_connection, client_address = listen_socket.accept()            # Handle one request and close the client connection. Then
            # loop over to wait for another client connection
            self.handle_one_request()    def handle_one_request(self):
        self.request_data = request_data = self.client_connection.recv(1024)        # Print formatted request data a la 'curl -v'
        print(''.join(            '< {line}\n&#39;.format(line=line)            for line in request_data.splitlines()
        ))
        self.parse_request(request_data)        # Construct environment dictionary using request data
        env = self.get_environ()        # It&#39;s time to call our application callable and get
        # back a result that will become HTTP response body
        result = self.application(env, self.start_response)        # Construct a response and send it back to the client
        self.finish_response(result)    def parse_request(self, text):
        request_line = text.splitlines()[0]
        request_line = request_line.rstrip(&#39;\r\n&#39;)        # Break down the request line into components
        (self.request_method,  # GET
         self.path,  # /hello
         self.request_version  # HTTP/1.1
         ) = request_line.split()    def get_environ(self):
        env = {}        # The following code snippet does not follow PEP8 conventions
        # but it&#39;s formatted the way it is for demonstration purposes
        # to emphasize the required variables and their values
        #
        # Required WSGI variables
        env[&#39;wsgi.version&#39;] = (1, 0)
        env[&#39;wsgi.url_scheme&#39;] = &#39;http&#39;
        env[&#39;wsgi.input&#39;] = StringIO.StringIO(self.request_data)
        env[&#39;wsgi.errors&#39;] = sys.stderr
        env[&#39;wsgi.multithread&#39;] = False
        env[&#39;wsgi.multiprocess&#39;] = False
        env[&#39;wsgi.run_once&#39;] = False
        # Required CGI variables
        env[&#39;REQUEST_METHOD&#39;] = self.request_method  # GET
        env[&#39;PATH_INFO&#39;] = self.path  # /hello
        env[&#39;SERVER_NAME&#39;] = self.server_name  # localhost
        env[&#39;SERVER_PORT&#39;] = str(self.server_port)  # 8888
        return env    def start_response(self, status, response_headers, exc_info=None):
        # Add necessary server headers
        server_headers = [
            (&#39;Date&#39;, &#39;Tue, 31 Mar 2015 12:54:48 GMT&#39;),
            (&#39;Server&#39;, &#39;WSGIServer 0.2&#39;),
        ]
        self.headers_set = [status, response_headers + server_headers]        # To adhere to WSGI specification the start_response must return
        # a &#39;write&#39; callable. We simplicity&#39;s sake we&#39;ll ignore that detail
        # for now.
        # return self.finish_response

    def finish_response(self, result):
        try:
            status, response_headers = self.headers_set
            response = &#39;HTTP/1.1 {status}\r\n&#39;.format(status=status)            for header in response_headers:
                response += &#39;{0}: {1}\r\n&#39;.format(*header)
            response += &#39;\r\n&#39;
            for data in result:
                response += data            # Print formatted response data a la &#39;curl -v&#39;
            print(&#39;&#39;.join(                &#39;> {line}\n'.format(line=line)                for line in response.splitlines()
            ))
            self.client_connection.sendall(response)        finally:
            self.client_connection.close()


SERVER_ADDRESS = (HOST, PORT) = 'localhost', 8080def make_server(server_address, application):
    server = WSGIServer(server_address)
    server.set_app(application)    return serverif __name__ == '__main__':
    httpd = make_server(SERVER_ADDRESS, application)
    print('WSGIServer: Serving HTTP on port {port} ...\n'.format(port=PORT))
    httpd.serve_forever()复制代码
ログイン後にコピー

もちろん、開発環境用のサーバーを作成するだけであれば、サーバーを再発明するのにそれほど苦労する必要はありません。 Python には組み込みモジュールがあるため、自分で操作してください。wsgi サーバー機能を提供します。

from wsgiref.simple_server import make_server
srv = make_server('localhost', 8080, application)
srv.serve_forever()复制代码
ログイン後にコピー

わずか 3 行のコードで wsgi サーバーを提供できます。とても便利だと思いませんか? 最後に、ブラウザーがリクエストを開始する効果をテストしてみましょう

上 これは wsgi の概要です。wsgi を深く理解している場合は、PEP333

関連する無料の学習推奨事項に慣れることができます: Python ビデオ チュートリアル

以上がWSGI とは何かを理解する必要がありますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

LinuxターミナルでPythonバージョンを表示するときに発生する権限の問題を解決する方法は? LinuxターミナルでPythonバージョンを表示するときに発生する権限の問題を解決する方法は? Apr 01, 2025 pm 05:09 PM

LinuxターミナルでPythonバージョンを表示する際の許可の問題の解決策PythonターミナルでPythonバージョンを表示しようとするとき、Pythonを入力してください...

あるデータフレームの列全体を、Python内の異なる構造を持つ別のデータフレームに効率的にコピーする方法は? あるデータフレームの列全体を、Python内の異なる構造を持つ別のデータフレームに効率的にコピーする方法は? Apr 01, 2025 pm 11:15 PM

PythonのPandasライブラリを使用する場合、異なる構造を持つ2つのデータフレーム間で列全体をコピーする方法は一般的な問題です。 2つのデータがあるとします...

プロジェクトの基本と問題駆動型の方法で10時間以内にコンピューター初心者プログラミングの基本を教える方法は? プロジェクトの基本と問題駆動型の方法で10時間以内にコンピューター初心者プログラミングの基本を教える方法は? Apr 02, 2025 am 07:18 AM

10時間以内にコンピューター初心者プログラミングの基本を教える方法は?コンピューター初心者にプログラミングの知識を教えるのに10時間しかない場合、何を教えることを選びますか...

文字列を介してオブジェクトを動的に作成し、Pythonでメソッドを呼び出す方法は? 文字列を介してオブジェクトを動的に作成し、Pythonでメソッドを呼び出す方法は? Apr 01, 2025 pm 11:18 PM

Pythonでは、文字列を介してオブジェクトを動的に作成し、そのメソッドを呼び出す方法は?これは一般的なプログラミング要件です。特に構成または実行する必要がある場合は...

uvicornは、serving_forever()なしでhttpリクエストをどのように継続的に聞いていますか? uvicornは、serving_forever()なしでhttpリクエストをどのように継続的に聞いていますか? Apr 01, 2025 pm 10:51 PM

UvicornはどのようにしてHTTPリクエストを継続的に聞きますか? Uvicornは、ASGIに基づく軽量のWebサーバーです。そのコア機能の1つは、HTTPリクエストを聞いて続行することです...

人気のあるPythonライブラリとその用途は何ですか? 人気のあるPythonライブラリとその用途は何ですか? Mar 21, 2025 pm 06:46 PM

この記事では、numpy、pandas、matplotlib、scikit-learn、tensorflow、django、flask、and requestsなどの人気のあるPythonライブラリについて説明し、科学的コンピューティング、データ分析、視覚化、機械学習、Web開発、Hの使用について説明します。

中間の読書にどこでもfiddlerを使用するときにブラウザによって検出されないようにするにはどうすればよいですか? 中間の読書にどこでもfiddlerを使用するときにブラウザによって検出されないようにするにはどうすればよいですか? Apr 02, 2025 am 07:15 AM

fiddlereveryversings for the-middleの測定値を使用するときに検出されないようにする方法

See all articles