1

私は以前、cherrypy ではメソッドを公開してそれをビュー ターゲットにする必要があることを知っていましたが、これもドキュメント全体に広がっています。

  import cherrypy
  @cherrypy.expose
  def index():
    return "hello world"

しかし、何も公開せずに動作するように見えるcherrypyアプリケーションを継承しました

これはどのように作動しますか?公開要件は新しいバージョンから削除されましたか?

これをグーグルで検索するのは簡単ではありません.cherrypyの公開とデコレーターについてはたくさん見つけましたが、「公開しないcherrypy」については何も見つかりませんでした.

これはメインの serve.py スクリプトです。ここでは簡潔にするためにいくつかの部分を削除しました。

# -*- coding: utf-8 -*-

import cherrypy
from root import RouteRoot


dispatcher = cherrypy.dispatch.RoutesDispatcher()
dispatcher.explicit = False
dispatcher.connect(u'system',      u'/system', RouteRoot().index)

conf = {
  '/' : {
    u'request.dispatch' : dispatcher,
    u'tools.staticdir.root' : conf_app_BASEDIR_ROOT, 
    u'log.screen' : True,
  },
  u'/my/pub' : {
    u'tools.staticdir.debug' : True,
    u'tools.staticdir.on' : True,
    u'tools.staticdir.dir' : u"pub",
  },
}
#conf = {'/' : {'request.dispatch' : dispatcher}}

cherrypy.tree.mount(None, u"/", config=conf)
import conf.ip_config as ip_config  
cherrypy.config.update({
  'server.socket_host': str(ip_config.host),
  'server.socket_port': int(ip_config.port),
})

cherrypy.quickstart(None, config=conf)

そして、アプリケーションのどこにも 'expose' はありません。どのように機能しますか?

ファイル root.py:

# -*- coding: utf-8 -*-

from mako.template import Template

class RouteRoot:

  def index(self):
    return "Hello world!"
4

3 に答える 3

2

わずかに異なる動作をするルートディスパッチャーに依存しているためです。主に、 (メソッドでわかるように) URL が明示的に記述されているためexposed、デコレータが設定する属性は必要ありません。一方、デフォルトの CherryPy ディスパッチャーは、URL とオブジェクト間の明示的なマッピングを提供しません。要求がアプリケーションのエンジンに到達すると、最初にマウントしたアプリケーションのツリーを通過する必要があります。この属性を使用して、メソッドが URL マッピングに参加できるかどうかを判断します。これにより、開発者は、URL マッピング プロセスではアクセスできないコントローラー クラスにメソッドを記述することができます。exposeconnect(...)exposed

于 2013-06-06T19:47:15.560 に答える
0

このページを読みました: http://docs.cherrypy.org/stable/concepts/dispatching.html

よくわかりませんが、ディスパッチが露出の必要性に取って代わるのかもしれません。

于 2013-06-06T19:41:14.897 に答える
0

これは、アプリがデフォルトのディスパッチャーを使用していないためです。ディスパッチャーのcherrypyのドキュメントで(太字で)説明されています

于 2013-06-06T19:41:23.073 に答える