11

SO / SFやその他のサイトでの提案によると、私はCherryPyをWSGIサーバーとして使用して、Flaskで構築したPythonWebサーバーの複数のインスタンスを起動しています。各インスタンスは独自のポートで実行され、Nginxの背後にあります。以下は私にとってはうまくいくことに注意する必要がありますが、私は物事を間違った方法で行ってしまい、「偶然に」機能することに悩んでいます。

これが私の現在のcherrypy.confファイルです:

[global]
server.socket_host = '0.0.0.0'
server.socket_port = 8891
request.dispatch: cherrypy.dispatch.MethodDispatcher()
tree.mount = {'/':my_flask_server.app}

私のFlaskサーバーに深く入り込むことなく、次のように開始します。

import flask
app = flask.Flask(__name__)

@app.route('/')
def hello_world():
    return "hello"

そして、Cherrydで起動するためにコマンドラインで発行するコマンドは次のとおりです。

cherryd -c cherrypy.conf -i my_flask_server

質問は次のとおりです。

  1. CherryPy内にFlaskをラップすることは、本番環境でFlaskを使用するための好ましい方法ですか? https://stackoverflow.com/questions/4884541/cherrypy-vs-flask-werkzeug

  2. これは、.confファイルを使用してCherryPyを起動し、Flaskアプリをインポートする適切な方法ですか?CherryPyのドキュメントを精査しましたが、ここで具体的に実行しようとしていることに一致するユースケースは見つかりません。

  3. 単一のマシンで複数のCherryPy/Flaskインスタンスを起動して、使用するポート(8891、8892など)ごとに一意の.confファイルを使用して複数のcherrydコマンド(-dなどでデーモン化)を実行する適切な方法はありますか?それとも、これを達成するためのより良い「CherryPy」の方法はありますか?

助けと洞察をありがとう。

4

2 に答える 2

5

Flaskについて話すことはできませんが、CherryPyについて話すことはできます。それは「適切な方法」のように見えます...ほとんど。MethodDispatcherに関するその行は、CherryPyアプリケーションにのみ影響し、マウントされていないように見えるため(代わりに単一のFlaskアプリのみ)、何もしません。

ポイント3に関しては、あなたはそれを正しく持っています。CherryPyを使用すると、同じプロセスで複数のサーバーオブジェクトを実行して、複数のポート(またはプロトコル)でリッスンできますが、複数のプロセスを起動するための機能はありません。あなたが言うように、さまざまな構成ファイルを持つ複数のcherrydコマンドがそれを行う方法です( eggmonsterのようなより統合されたクラスター/構成管理ツールを使用したい場合を除く)。

于 2011-05-13T06:17:38.167 に答える
3

用語:取り付けと接ぎ木

原則として、これはチェリーピーを介してフラスコアプリを提供する適切な方法です。名前を簡単にメモしてください。

tree.mountここで、それ自体が構成キーではないことに注意してください。引数を指定treecherrypy._cpconfig._tree_config_handler(k, v)て呼び出されることになります'mount', {'/': my_flask_server.app}

キーパラメータはまったく使用されない_tree_config_handlerため、設定では「mount」はパスマッピングの特定のdictの任意のラベルにすぎません。また、アプリケーションを「マウント」しません(結局、CherryPyアプリではありません)。つまり、それはそうcherrypy.tree.mount(…)ではなくcherrypy.tree.graft、「script-name」(パスですが、CherryPyの用語では)名前空間への任意のWSGIハンドラーです。

Cherrypyのログメッセージには、「<appasstring>が/にマウントされました」と誤解を招く可能性があります]

グラフトでは、マウントとは異なり、アプリの静的ファイルサービスやそのパスでのストリーミング応答などの追加オプションを指定できないため、これはやや重要なポイントです。

そのため、構成キーを、その構成が原因でCherryPy内で何が発生するか(メソッドがあるため)tree.mountについてあまり多くのセマンティクスを読まないような説明的なものに変更することをお勧めします。たとえば、そのdictにその1つのアプリをマッピングするだけの場合(多くのディレクティブが存在する可能性があり、それらすべてがパスの名前空間にマージされるだけです)、またはそのdictに多くのアプリをマッピングする場合です。cherrypy.tree.mounttree.flask_app_nametreetree.wsgi_delegates

CherryPyを使用して、アプリを作成せずに追加のコンテンツを提供する

もう1つの注意点として、たとえばアプリに静的ファイルサービスを提供するようにcherrypyが必要な場合は、その構成を保持するために定型的なcherrypyアプリを作成する必要はありません。None適切な追加構成でマウントする必要があります。次のファイルは、静的コンテンツを提供するためにcherrydを起動するディレクトリに配置されている場合、サブディレクトリ「static」から静的コンテンツを提供するためにCherryPyを使用するのに十分です(cherrydを次のように呼び出しますcherryd -c cherrypy.conf -i my_flask_server -i static

static.py

import cherrypy
# next line could also have config as an inline dict, but
# file config is often easier to handle
cherrypy.tree.mount(None, '/static-path', 'static.conf')

static.conf

# static.conf
[/]
tools.staticdir.on = True
tools.staticdir.root = os.getcwd()
tools.staticdir.dir = 'static'
tools.staticdir.index = 'index.html'
于 2013-05-23T08:39:58.087 に答える