web-dev-qa-db-ja.com

Werkzeugとは正確には何ですか?

公式ドキュメント から:

Werkzeugは、Python用のWSGIユーティリティライブラリです。

ただし、Flask Webアプリケーションを実行すると、サーバーからの応答ヘッダーに次が含まれていることに気付きます。

HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 13
Server: Werkzeug/0.11.9 Python/2.7.10
Date: Tue, 03 May 2016 12:50:08 GMT

4行目では、サーバーはWerkzeugに言及していますが、正確にWerkzeugとは何ですか、それはApacheのようなWebサーバーですか?

32
jinglei

いいえ、ApacheのようなWebサーバーではありません。それはCGIライブラリです。 Apache(またはあなたのFlaskアプリケーション)はおそらくライブラリを使用してHTTPリクエストを処理しているため、おそらくそのヘッダーを応答に追加します。

7

いいえ、そうではありません

Werkzeug(WSGIライブラリ)は、pythonコードとhttp nginx/Apacheサーバー間の通信機のようなものです

以下は、Werkzeug WSGIの完全な使用例です。

WSGIには2つの側面があります:「サーバー」または「ゲートウェイ」側(多くの場合、ApacheやNginxなどのWebサーバー)、および「アプリケーション」または「フレームワーク」側(Pythonスクリプト自体)。WSGI要求を処理するために、サーバー側はアプリケーションを実行し、環境情報とコールバック関数をアプリケーション側に提供します。アプリケーションは要求を処理し、提供されたコールバック関数を使用して応答をサーバー側に返します。

サーバーとアプリケーションの間には、APIの両側を実装するWSGIミドルウェアが存在する場合があります。サーバーはクライアントからリクエストを受信し、それをミドルウェアに転送します。処理後、アプリケーションにリクエストを送信します。アプリケーションの応答は、ミドルウェアによってサーバーに転送され、最終的にはクライアントに転送されます。 WSGI準拠のアプリケーションのスタックを形成する複数のミドルウェアが存在する場合があります。

それが役に立てば幸い

21
Muhammad Usman

Werkzeugは主にライブラリであり、Webサーバーではありませんが、開発用のシンプルなWebサーバーを提供します。その開発サーバーは、その_Server:_ヘッダーを提供するものです。

さらに詳しく説明する:

まず、WSGIについて説明しましょう。 Apache、Nginx、Lighttpdなど、多数のWebサーバーがあります。Pythonなどで書かれたWebフレームワークも多数あります。 Django、Flask、Tornado、Pyramidなど。これらがすべて相互運用可能であれば、非常に便利です。そこでWSGIが登場します。アイデアは次のとおりです。

  • クライアントのHTTP要求への応答には、WebサーバーWebアプリケーション。サーバーは、ネットワーク接続の複雑さを処理し、要求を受信し、応答を送信します。アプリケーションは要求データを受け取り、それに基づいて動作し、サーバーが送信する応答を作成します。

  • Python Webアプリケーションを作成する場合は、HTTPヘッダー、入力フォームデータ、環境変数などの特定のパラメーターを受け入れる呼び出し可能なオブジェクト(関数など)があることを確認してください。

  • Pythonアプリを提供するWebサーバーを作成する場合は、HTTP要求が着信するたびにアプリケーションからその呼び出し可能オブジェクトを呼び出すようにします。

  • WSGI仕様( PEP 33 )では、その呼び出し可能オブジェクトのパラメーターと戻り値を正確に指定しているため、すべてのサーバーはすべてのアプリケーションと対話する方法を知っています。

そのため、すべてのWebアプリケーションがこの呼び出し可能オブジェクトを提供し、受信する特定のパラメーターを処理できる必要があることを知っています。 すべてのアプリケーションはこれを行う必要があります...それはライブラリを使用する良い機会のように聞こえます。 Werkzeugはこのライブラリです。

Werkzeugは、WSGI準拠のアプリケーションを開発するための多数のユーティリティを提供しています。これらのユーティリティは、ヘッダーの解析、Cookieの送受信、フォームデータへのアクセスの提供、リダイレクトの生成、例外発生時のエラーページの生成、さらにはブラウザーで実行される対話型デバッガーの提供などを行います。それは本当に包括的なものです。 Flaskはこの基盤(およびJinja、Clickなど)に基づいて構築され、完全なWebフレームワークを提供します。

Werkzeugがapplicationsのライブラリである場合、サーバーヘッダーに表示されるのはなぜですか?

Werkzeugdoesには、サーバーロール用のモジュールもあります。これは、単に便宜上のものです。

ApacheやNginxのような本格的なWebサーバーのインストールと設定には多大な労力がかかりますが、開発ボックスでアプリケーションをテストするだけではほぼ間違いなく過剰です。そのため、Werkzeugは開発サーバーを提供します。これは、単一のコマンドで実行でき、構成はほとんどない単純なWebサーバーです。 _flask run_(またはwerkzeug.serving.run_simple())を実行すると、この開発サーバーが得られます。そして、開発サーバーの_Server:_ヘッダーは、ご想像のとおり、_Werkzeug/<version> Python/<version>_です。

このサーバーは、本番用ではありません。少なくとも、ドキュメントによると、うまくスケールしません。しかし、セキュリティなどの他の懸念事項があったとしても、私は驚かないでしょう。

18
Nick

そうではないからです。

セットアップでは、おそらく「開発サーバー」(run_simple関数)テスト用。そのため、この使用例では(非常に)貧乏人のApacheのようですが、HTTPリクエストに正しく応答できるという意味でのみです。

Docs http://werkzeug.pocoo.org/docs/serving/ を確認すると、次の注意事項が表示されます。

開発サーバーは、実稼働システムで使用することを目的としていません。特に開発目的のために設計されており、高負荷下でのパフォーマンスが低下します。展開のセットアップについては、アプリケーションの展開ページをご覧ください。

11
sebastian