2

私はCherryPyが初めてです。次のような URL 構造を持つデフォルトのディスパッチャーを使用しています。

root = Root()
root.page1 = Page1()
root.page1.apple = Apple()
root.page2 = Page2()
root.page2.orange = Orange()

Orangeへのリンクが必要なテンプレートをレンダリングしAppleます。私はただハードコードすることができました/page1/apple/。しかし、どうすればAppleDRY の URL を取得できますか?

これは、CherryPy のデフォルトのディスパッチャで実行できますか?それとも Routes ディスパッチャでのみ可能ですか?

(私はreverse()、この目的のために使用する Django の世界から来ました。)

4

1 に答える 1

2

マウントされたアプリには次の方法でアクセスできます

cherrypy.tree.apps[mount_point].root

rootは、常にマウント ポイントにマウントされたインスタンスです。したがって、逆関数は次のようになります。

def reverse(cls):
    # get link to a class type
    for app_url in cherrypy.tree.apps.keys():
        if isinstance(cherrypy.tree.apps[app_url].root, cls):
            # NOTE: it will return with the first mount point of this class
            return app_url

クラスを使用する以下のサンプル コードを見つけてください。http://localhost:8080/page4/orange/プリントアウト{ Orange and the link to apple: : "/page3/apple" }

import cherrypy

link_to_apple_global = ''

class Orange(object):
    def __init__(self):
        pass
    @cherrypy.expose
    @cherrypy.tools.json_out()
    def index(self):
        return {"Orange and the link to apple: ": link_to_apple_global}
class Page2(object):

    def __init__(self):
        pass
    @cherrypy.expose
    def index(self):
        return "Page2"
class Apple(object):

    def __init__(self):
        pass
    @cherrypy.expose
    def index(self):
        return "Apple"

class Page1(object):

    def __init__(self):
        pass
    @cherrypy.expose
    def index(self):
        return "Page1"

class Root(object):

    def __init__(self):
        pass
    @cherrypy.expose
    def index(self):
        return "Root"            

def reverse(cls):
    #return cherrypy.tree.apps.keys()
    #return dir(cherrypy.tree.apps[''].root)
    #return dir(cherrypy.tree.apps['/page3/apple'].root)
    # get link to apple
    for app_url in cherrypy.tree.apps.keys():
        if isinstance(cherrypy.tree.apps[app_url].root, cls):
            # NOTE: it will return with the first instance
            return app_url

root = Root()
root.page1 = Page1()
root.page1.apple = Apple()
root.page2 = Page2()
root.page2.orange = Orange()

cherrypy.tree.mount(root, '/')
# if you do not specify the mount points you can find the objects
# in cherrypy.tree.apps[''].root...
cherrypy.tree.mount(root.page1, '/page4')
cherrypy.tree.mount(root.page2, '/page3')
cherrypy.tree.mount(root.page2.orange, '/page4/orange')
cherrypy.tree.mount(root.page1.apple, '/page3/apple')

link_to_apple_global = reverse(Apple)

cherrypy.engine.start()
cherrypy.engine.block()
于 2013-01-16T07:35:53.387 に答える