1

2 つのクラスを含む単純な Cherrypy Web アプリケーションがあります。初期化コードは次のようになります。

c = MyClass()
c.updates = AnotherClass()
app = cherrypy.tree.mount(c, '/', 'myapp.config')
c.setConfig(app.config)
c.updates.setConfig(app.config)
cherrypy.engine.start()
cherrypy.engine.block()

両方のクラスの setConfig メソッドは、データベース構成を格納するための単なるコード行です。

def setConfig(self, conf):
    self.config = conf['Database']

構成ファイル myapp.config は次のようになります。

[global]
server.socket_host = "0.0.0.0"
server.socket_port = 80

[/]
tools.staticdir.root = com.stuff.myapp.rootDir + '/html'

[Database]
dbtable: "mydbtable"
username: "user"
password: "pass"

ロットを開始すると、アプリケーションはデータベース構成データを取得し、/html ディレクトリから静的ファイルを正しく提供しますが、8080 の localhost でしかリッスンしません。コンソールに次のように表示されます。

[11/Apr/2013:10:03:58] ENGINE Bus STARTING
[11/Apr/2013:10:03:58] ENGINE Started monitor thread 'Autoreloader'.
[11/Apr/2013:10:03:58] ENGINE Started monitor thread '_TimeoutMonitor'.
[11/Apr/2013:10:03:58] ENGINE Serving on 127.0.0.1:8080
[11/Apr/2013:10:03:58] ENGINE Bus STARTED

私は間違いなく何か悪いことをしたに違いありません。構成のグローバル部分が適用されないかのようです。どうすれば修正できますか?

4

1 に答える 1

1

解決方法がわかったと思います。この行を追加しました:

cherrypy.config.update('myapp.config')

という行の後に

app = cherrypy.tree.mount(c, '/', 'myapp.config')

私のクラスがデータベース構成を取得した理由は、setConfig()呼び出しで手動で渡すためだと思います。これは、グローバル構成ではなく、アプリケーション構成のみを渡します。私が思っていたように、mount() 呼び出しは、マウントするオブジェクトに構成データを伝達しないようです。

さらに、update()呼び出しは、 mount()呼び出しの後に行う必要があります。そうしないと、例外が発生します。

これがこのコードを整理する最良の方法かどうかはわかりません。これは今のところ機能しますが、より良いアイデアはいつでも歓迎されます。

于 2013-04-12T10:28:26.137 に答える