組み込みのHTTPサーバーと内部エンジン

CherryPyには、独自のWeb(HTTP)サーバーが付属しています。そのため、CherryPyは自己完結型であり、ユーザーはライブラリを取得してから数分以内にCherryPyアプリケーションを実行できます。

ザ・ web server アプリケーションへのゲートウェイとして機能し、すべての要求と応答を追跡します。

Webサーバーを起動するには、ユーザーは次の呼び出しを行う必要があります-

cherryPy.server.quickstart()

ザ・ internal engine of 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 ())

上記のコードの出力を取得するには、以下の手順に従ってください-

Step 1 −上記のファイルを次のように保存します tutRoutes.py

Step 2 −次のURLにアクセスしてください−

http://localhost:8080/generate?length=10

Step 3 −次の出力が表示されます−