一千萬個為什麽

搜索

構建cherrypy應用程序的最佳實踐有哪些?

我正在寫一個櫻桃應用程序,我想知道構建我的處理程序和代碼的最佳方法是什麽?

我意識到賦值是簡單的通過cherrypy.root,但是編寫處理程序並分配它們的一些做法是什麽?

(請允許我證明我的困惑!) 我最初的想法是編寫一個標準的處理程序類,它根據當前的URL或類/方法組合推斷出要運行的模板。然後我會多次將該處理程序的一個實例分配給創建頁面的路徑。我不認為這有效,因為遞歸引用不會正常工作。

所以,鑒於我已經在我自己的源代碼應該如何看待空白的事實,我會喜歡一些指針和示例!

隨意提出一些詳細的問題讓我澄清一下。雖然有很多櫻桃教程材料,但它往往只是劃傷表面。

最佳答案

CherryPy故意不要求您從框架提供的基類繼承,以便您可以自由設計自己的繼承機制,或者更重要的是,根本不使用任何基類。您當然可以自由定義自己的基類並繼承它;通過這種方式,您可以通過類的 __ init __ 方法以及類級變量和方法來標準化處理程序構造和配置。

但是,首選方法是不同的。對於大多數Web應用程序,您實際上並不想改變處理程序的實際構造邏輯,也不關心類級變量或方法;相反,您需要每個URI或URI的每個子樹或每個站點的可重用變量和方法,而不是每個類。您傾向於通過實例配置(處理程序元數據)和實例方法(處理程序邏輯)更改另一組處理程序中的一組處理程序。傳統的基於類的繼承可以做到這一點,但對於這種自定義來說,這是一種鈍器。

CherryPy, therefore, is designed to provide this sort of per-resource-set customization that class-based inheritance doesn't do well. It provides this through 1) the design of its configuration system, which allows you to bind metadata to a single URI, a subtree of URI's, a subtree of handlers, or a whole site with the same syntax (see http://docs.cherrypy.org/dev/intro/concepts/config.html for an overview), and 2) the hooks and tools system, which allows you to bind logic to a single URI, a subtree of URI's, a subtree of handlers, or a whole site. See http://docs.cherrypy.org/dev/intro/concepts/tools.html

所以,實際上:在 cherrypy.root 上使用普通屬性來構建處理程序樹:

def make_app():
    root = Root()
    root.foo = Foo()
    root.bars = BarCollection()
    return root

但是,不要讓Root,Foo和Bar從公共基類繼承。相反,編寫獨立的工具來執行“推斷模板”之類的操作。也就是說,而不是:

from cherrypy import expose

class Foo(MyAppBase):
    @expose()
    def index(self, a, b, c):
        ...

root.foo = Foo(template='foo.html')

寫:

from cherrypy import expose, tools

class Foo(object):
    @tools.render(template='foo.html')
    @expose()
    def index(self, a, b, c):
        ...

root.foo = Foo()

...'tools.render'是您編寫的CherryPy工具,用於查找並應用給定的模板。此方法將允許您覆蓋配置文件中工具的參數,並避免重新打包或修補代碼:

[/foo/]
tools.render.template = 'foo2.html'

轉載註明原文: 構建cherrypy應用程序的最佳實踐有哪些?