WSGI とは何かを理解する必要があります
Python ビデオ チュートリアル コラムでは 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 を充電できなくなります。

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'.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'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('\r\n') # 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's formatted the way it is for demonstration purposes # to emphasize the required variables and their values # # Required WSGI variables env['wsgi.version'] = (1, 0) env['wsgi.url_scheme'] = 'http' env['wsgi.input'] = StringIO.StringIO(self.request_data) env['wsgi.errors'] = sys.stderr env['wsgi.multithread'] = False env['wsgi.multiprocess'] = False env['wsgi.run_once'] = False # Required CGI variables env['REQUEST_METHOD'] = self.request_method # GET env['PATH_INFO'] = self.path # /hello env['SERVER_NAME'] = self.server_name # localhost env['SERVER_PORT'] = str(self.server_port) # 8888 return env def start_response(self, status, response_headers, exc_info=None): # Add necessary server headers server_headers = [ ('Date', 'Tue, 31 Mar 2015 12:54:48 GMT'), ('Server', 'WSGIServer 0.2'), ] self.headers_set = [status, response_headers + server_headers] # To adhere to WSGI specification the start_response must return # a 'write' callable. We simplicity's sake we'll ignore that detail # for now. # return self.finish_response def finish_response(self, result): try: status, response_headers = self.headers_set response = 'HTTP/1.1 {status}\r\n'.format(status=status) for header in response_headers: response += '{0}: {1}\r\n'.format(*header) response += '\r\n' for data in result: response += data # Print formatted response data a la 'curl -v' print(''.join( '> {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 サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









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

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

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

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

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

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

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