2012-06-21 70 views
2

在CherryPy文檔的"Dispatching/Other Dispatchers"部分中,有一個Django樣式的正則表達式到視圖函數映射定義的示例,但沒有說明如何將其附加到​​。在CherryPy中使用映射

你應該如何註冊這個映射?

編輯:基於cherrypy-users谷歌組中的"regex URL mapping" thread,我能想出的是使用正則表達式附加意見,則需要使用使用routes風格映射cherrypy.dispatch.RoutesDispatcher類,像這樣:

def hello(name='stranger'): 
    """Sample view.""" 
    return 'Hello, %s!'%name 

dispatch = cherrypy.dispatch.RoutesDispatcher() 
dispatch.connect('hello-1', '/hello', hello) 
dispatch.connect('hello-2', '/hello/{name:([^/]+)}', hello) 
cherrypy.tree.mount(None, config={ 
     '/': { 
      'request.dispatch': dispatch, 
      } 
     }) 

請注意URL模式中的{argument-name:regular-expression}語法。

有沒有一種方法可以使用CherryPy文檔中所示的列表對語法來指定路由模式?

回答

0

沒有任何額外的步驟需要。在請求期間,​​執行第一個路由階段,其中傳入請求使用其路徑到應用程序映射映射到應用程序。當您在啓動時調用tree.mount(root=None, script_name='/', config=conf)時,樹會在後臺爲您創建一個cherrypy.Application並將其掛載在「/」處。

一旦找到應用程序,它的配置就會接管,文檔中示例應用程序的「request.dispatch」配置文件顯示「在此應用程序中使用RoutesDispatcher作爲所有URI」。那RoutesDispatcher實例然後將請求的控制權傳遞給適當的Controller。

文檔中的正則表達式示例甚至沒有很好開發。你需要一個使用它的調度器。該過程「僅」需要找到處理程序並收集request.config,但這兩個活動可能非常複雜,具體取決於所選的分派樣式。查看現有調度員的靈感。

+0

你看過我提到的[示例](http://docs.cherrypy.org/stable/concepts/dispatching.html#other-dispatchers)嗎? 'mappings'變量不會傳遞給'cherrypy.tree'。 –

+1

啊!現在我明白你的問題了:)這個「例子」並不是真正的規範性的,它只是爲了說明基於正則表達式的解決方案的地圖本身的樣子。爲了完成它,你必須編寫一個Dispatcher子類,用它來返回頁面處理程序並收集當前請求的配置。這個過程對於不同的風格是如此不同,很難告訴你如何爲一個特定的風格,而不是自己做這一切。 ;)但'_cpdispatch.py​​'中有現成的調度程序幫助開始。 – fumanchu

+0

我已經看過'_cpdispatch.py​​',並且肯定沒有發現支持這樣的正則表達式處理器映射列表的調度器:-)所以,基本上,CherryPy沒有內置的對Django式調度器的支持,如示例。我知道了。如果你在答案中明確說明了這一點,我會接受它。 –