Cherrypy-bulit-in-http-server-and-internal-engine
組み込みのHttpサーバーと内部エンジン
CherryPyには、独自のWeb(HTTP)サーバーが付属しています。 そのため、CherryPyは自己完結型であり、ユーザーはライブラリを取得してから数分以内にCherryPyアプリケーションを実行できます。
- Webサーバー*は、アプリケーションへのゲートウェイとして機能し、すべての要求と応答が追跡されます。
Webサーバーを起動するには、ユーザーは次の呼び出しを行う必要があります-
cherryPy.server.quickstart()
CherryPyの*内部エンジン*は、次の活動を担当します-
- 要求および応答オブジェクトの作成と管理。
- CherryPyプロセスの制御と管理。
CherryPy –設定
このフレームワークには、HTTPサーバーをパラメーター化できる独自の構成システムが付属しています。 構成の設定は、INI形式に近い構文のテキストファイルまたは完全なPython辞書として保存できます。
CherryPyサーバーインスタンスを構成するには、開発者は設定のグローバルセクションを使用する必要があります。
global_conf = {
'global': {
'server.socket_host': 'localhost',
'server.socket_port': 8080,
},
}
application_conf = {
'/style.css': {
'tools.staticfile.on': True,
'tools.staticfile.filename': os.path.join(_curdir, 'style.css'),
}
}
This could be represented in a file like this:
[global]
server.socket_host = "localhost"
server.socket_port = 8080
[/style.css]
tools.staticfile.on = True
tools.staticfile.filename = "/full/path/to.style.css"
HTTPコンプライアンス
CherryPyはゆっくりと進化していますが、HTTP/1.0のサポートを含むHTTP仕様のコンパイルが含まれ、後でHTTP/1.1のサポートで転送されます。
CherryPyは、仕様のすべての必須レベルではなく、すべての必須レベルと必須レベルを実装しているため、HTTP/1.1に条件付きで準拠していると言われています。 したがって、CherryPyはHTTP/1.1の次の機能をサポートしています-
- クライアントがHTTP/1.1をサポートすると主張する場合、指定されたプロトコルバージョンで行われた要求でヘッダーフィールドを送信する必要があります。 完了していない場合、CherryPyはすぐにリクエストの処理を停止します。
- CherryPyは、すべての構成で使用されるDateヘッダーフィールドを生成します。
- CherryPyは、クライアントのサポートで応答ステータスコード(100)を処理できます。
- CherryPyのビルトインHTTPサーバーは、Connection:Keep-Aliveヘッダーを使用することにより、HTTP/1.1のデフォルトである持続的接続をサポートします。
- CherryPyは、正しくチャンクされたリクエストとレスポンスを処理します。
- CherryPyは、If-Modified-SinceおよびIf-Unmodified-Sinceヘッダーという2つの異なる方法でリクエストをサポートし、リクエストに応じて応答を送信します。
- CherryPyでは、任意のHTTPメソッドを使用できます。
- CherryPyは、クライアントとサーバーに設定された設定との間のHTTPバージョンの組み合わせを処理します。
マルチスレッドアプリケーションサーバー
CherryPyは、マルチスレッドの概念に基づいて設計されています。 開発者がCherryPy名前空間に値を取得または設定するたびに、マルチスレッド環境で実行されます。
cherrypy.requestとcherrypy.responseはどちらもスレッドデータコンテナです。これは、実行時にどのリクエストがプロキシされるかを知ることで、アプリケーションが独立してそれらを呼び出すことを意味します。
スレッドパターンを使用するアプリケーションサーバーは、スレッドの使用が同期要件による問題の可能性を高めると見なされるため、高く評価されていません。
他の選択肢は次のとおりです-
マルチプロセスパターン
各リクエストは、独自のPythonプロセスによって処理されます。 ここでは、サーバーのパフォーマンスと安定性が優れていると見なすことができます。
非同期パターン
ここでは、新しい接続を受け入れてデータをクライアントに送り返すことは、要求プロセスから非同期に行われます。 この手法は、その効率性で知られています。
URLディスパッチ
CherryPyコミュニティは、より柔軟になりたいと考えており、ディスパッチャ向けの他のソリューションが評価されます。 CherryPy 3は、他のビルトインディスパッチャーを提供し、独自のディスパッチャーを作成して使用する簡単な方法を提供します。
- HTTPメソッドの開発に使用されるアプリケーション。 (GET、POST、PUTなど)
- URLでルートを定義するもの– Routes Dispatcher
HTTPメソッドディスパッチャー
一部のアプリケーションでは、URIはアクションに依存せず、アクションはリソース上でサーバーによって実行されます。
たとえば、* http://xyz.com/album/delete/10*
URIには、クライアントが実行したい操作が含まれています。
デフォルトでは、CherryPyディスパッチャーは次のようにマッピングされます-
album.delete(12)
上記のディスパッチャは正しく言及されていますが、次の方法で独立させることができます-
http://xyz.com/album/10
ユーザーは、サーバーが正確なページをどのようにディスパッチするか疑問に思うかもしれません。 この情報は、HTTP要求自体によって伝送されます。 クライアントからサーバーへのリクエストがある場合、CherryPyは最適なハンドラーを探します。ハンドラーはURIがターゲットとするリソースの表現です。
DELETE/album/12 HTTP/1.1
ルートディスパッチャー
これは、ディスパッチに必要なメソッドのパラメータのリストです-
- nameパラメーターは、接続するルートの一意の名前です。
- ルートは、URIに一致するパターンです。
- コントローラーは、ページハンドラーを含むインスタンスです。
- Routesディスパッチャーを使用すると、URIに一致するパターンが接続され、特定のページハンドラーが関連付けられます。
例
それがどのように機能するかを理解するために例を挙げましょう-
import random
import string
import cherrypy
class StringMaker(object):
@cherrypy.expose
def index(self):
return "Hello! How are you?"
@cherrypy.expose
def generate(self, length=9):
return ''.join(random.sample(string.hexdigits, int(length)))
if __name__ == '__main__':
cherrypy.quickstart(StringMaker ())
上記のコードの出力を取得するには、以下の手順に従ってください-
ステップ1 *-上記のファイルを *tutRoutes.py として保存します。
- ステップ2 *-次のURLにアクセスします-
http://localhost:8080/generate?length=10
- ステップ3 *-次の出力を受け取ります-