Python 构建cherrypy应用程序的最佳实践是什么?

Python 构建cherrypy应用程序的最佳实践是什么?,python,cherrypy,program-structure,Python,Cherrypy,Program Structure,我正在编写一个cherrypy应用程序,我想知道为大型应用程序构建处理程序和代码的最佳方式是什么 我意识到通过cherrypy.root分配是很简单的,但是编写处理程序并分配它们有哪些实践呢 (请允许我证明我的困惑!) 我最初的想法是编写一个标准处理程序类,根据当前URL或类/方法组合推断要运行的模板。然后,我会多次将该处理程序的一个实例分配给创建页面的路径。然而,我不认为这是可行的,因为递归引用不会很好地工作 因此,考虑到我已经对自己的源代码应该是什么样子画了空白,我想要一些指针和示例 请随意

我正在编写一个cherrypy应用程序,我想知道为大型应用程序构建处理程序和代码的最佳方式是什么

我意识到通过cherrypy.root分配是很简单的,但是编写处理程序并分配它们有哪些实践呢

(请允许我证明我的困惑!) 我最初的想法是编写一个标准处理程序类,根据当前URL或类/方法组合推断要运行的模板。然后,我会多次将该处理程序的一个实例分配给创建页面的路径。然而,我不认为这是可行的,因为递归引用不会很好地工作

因此,考虑到我已经对自己的源代码应该是什么样子画了空白,我想要一些指针和示例


请随意问一些详细的问题让我澄清。虽然有大量的cherrypy教程材料,但它往往只触及表面。

这个问题非常主观,但我想试一试

  • 首先,始终将数据库和数据代码与web代码分开。我所做的是在
    DB/
    文件夹中有很多小文件,每个文件有一个类,这些文件都连接到一个
    Base.py
    文件中,例如: 当然,不要忘记每个模块目录中的
    \uuuu init\uuuu.py
    ,这样python就可以在子目录中找到模块

  • 在我看来,用什么方法构造代码并不总是重要的,但要保持一致。我写了一份文件,列出了我所有的约定,以及我使用它们的理由,并试图遵循它们,直到有意义为止,但像往常一样,
    一个愚蠢的一致性是小头脑的小妖精
    ,引用:-)

  • 尽量使用类而不是直接的函数。这对小项目可能无关紧要,但对任何事情来说,非琐碎的事情都会变得困难。我倾向于有许多具有特定用途的文件,并且在一个文件中只有一个类,除非有多个

  • 这一个可能是有争议的-我通常将我的类命名为
    Class
    ,并仅通过模块名称引用它。我将给出Base.py的一个示例: Web/ Base.py - The main "base" class, which includes the classes in other web files, starts the web server in
    __init__
    Users.py - The class which includes methods generally from "DB/Users.py" which checks permissions etc before returning (you may wish to add DB-level security later though) ... DB/ Base.py - The main base DB class, includes the other DB classes. Creates new SQLAlchemy/whatever instances and create database schemas if they don't etc. May pay to have database-wide methods here to keep creating connections etc in one place if you decide to change databases later Users.py - The user/password etc DB storage class file ... Templates/ (HTML templates go here) Static/ (Static images/CSS/javscript etc go here) 这有助于减少导入时其他模块相互引用时出现的问题,因为如果
    Users.py
    具有
    from Base import x
    ,则
    from Users import Users
    将发生冲突,因此我始终按模块名称引用。不过这只是个人喜好,所以你想怎么做就怎么做

希望你能从这篇文章中得到一些想法。

CherryPy故意不要求你从框架提供的基类中进行子类化,这样你就可以自由地设计自己的继承机制,或者更重要的是,根本不使用任何继承机制。您当然可以自由定义自己的基类并从中继承;通过这种方式,您可以通过类的
\uuuu init\uuu
方法以及类级变量和方法来标准化处理程序的构造和配置

然而,首选的方法是不同的。对于大多数web应用程序,您并不想改变处理程序的实际构造逻辑,也不太关心类级变量或方法;相反,您希望每个URI或每个URI子树或每个站点(而不是每个类)使用可重用的变量和方法。您往往会根据实例配置(处理程序元数据)和实例方法(处理程序逻辑)将一组处理程序与另一组处理程序区别开来。传统的基于类的继承可以做到这一点,但对于这种定制来说,它有点生硬

因此,CherryPy旨在提供这种基于类的继承不能很好实现的每资源集定制。它通过1)其配置系统的设计(允许您将元数据绑定到单个URI、URI的子树、处理程序的子树或具有相同语法的整个站点(请参阅以获取概述)来实现这一点;2)挂钩和工具系统(允许您将逻辑绑定到单个URI、URI的子树、处理程序的子树),或者整个网站。看

因此,实际上:一定要在
cherrypy.root
上使用普通属性来构建处理程序树:

import Users
class Base(Users.Class):
   def 
__init__
(self): Users.Class.
__init__
(self)
但是,不要让Root、Foo和Bar从公共基类继承。相反,编写独立的工具来完成“推断模板”之类的工作。也就是说,而不是:

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

from cherrypy import expose

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

root.foo = Foo(template='foo.html')
…其中“tools.render”是您编写的用于查找和应用给定模板的CherryPy工具。此方法将允许您覆盖配置文件中工具的参数,并避免重新打包或修补代码:

from cherrypy import expose, tools

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

root.foo = Foo()

你能提供一个你想做什么的例子吗?我想构建我的程序。目前我还没有考虑具体的应用。我想知道一种创建可管理代码的方法。除此之外,我最终不可避免地想知道在哪里为我使用的模板引擎存储模板。我说的是最一般意义上的源代码布局,应该放在哪里,应该如何调用。我很想听听你对我目前制作MVC方法的看法:我正在编写一个默认类,我将始终指定它为我的根。它将公开一个默认(self、*args、**kwargs)方法。这样,每当一个请求没有被处理时,我就可以尝试动态实例化一个“controller”类,然后使用来自控制器的结果触发一个模板。如果你觉得这是“rails式的”,那肯定是相似的。我在PHP中采用了这种方法,在过去取得了很好的效果。虽然没有什么比我能用cherrypy做的更有希望的了!在我看来,如果只有静态方法,那么最好在函数之前使用
@expose()
,或者在函数之后使用
function.exposed=True
,这取决于您喜欢哪种方法(我喜欢lat
[/foo/]
tools.render.template = 'foo2.html'