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

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

(请允许我证明自己的混乱!)我的最初想法是编写一个标准处理程序类,该类别根据当前的URL或类/方法组合来渗透模板以运行。然后,我会将该处理程序的一个实例多次分配给创建页面的路径。然而,我认为这不起作用,因为递归引用不能正常工作。

因此,考虑到我已经在我自己的源代码应该是什么样子上画了空白,我希望得到一些指示和示例!

请随时问一些详细的问题让我澄清。虽然有很多精彩的教程材料,但它们往往只触及表面。

有帮助吗?

解决方案

这个问题非常主观——但我会尝试一下。

  • 首先,始终将数据库和数据代码与 Web 代码分开。我所做的是有很多小文件,每个文件一个类 DB/ 文件夹全部连接在一起形成一个 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)
    
    不要忘记 __init__.py 当然在每个模块目录中,这样Python就可以在子目录中找到模块

  • 在我看来,使用什么方法来构建代码并不总是重要的,但要保持一致。我写了一份文档,其中包含我的所有约定以及使用它们的理由,并尝试遵循它们直到有意义的程度,但一如既往 a foolish consistency is the hobgoblin of small minds, ,如引用 python 风格的文档 :-)

  • 尝试使用类而不是直接函数。对于小项目来说这可能并不重要,但对于任何不平凡的事情都可能变得困难。我倾向于拥有许多具有特定用途的文件,并且在一个文件中只包含一个类,除非有多个类是有意义的

  • 这可能是有争议的 - 我通常为我的课程命名 Class 只需通过模块名称引用它即可。我举一个 Base.py 的例子:
    import Users
    class Base(Users.Class):
        def __init__(self):
            Users.Class.__init__(self)
    
    这有助于减少其他模块在导入时相互引用时出现的问题,例如 from Users import Users 如果 Users.pyfrom Base import x 所以我总是按模块名称引用。这只是个人喜好,所以做你想做的:-P

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

其他提示

CherryPy的刻意不要求你从一个框架提供的基类的子类,让你可以自由地设计自己的继承机制,或者,更重要的是,在所有使用没有。你一定是免费的,从它定义自己的基类继承和;这样,你可以通过你的类的__init__方法标准化处理建设和配置,以及通过类级别的变量和方法。

然而,优选的方法是不同的。对于大多数Web应用程序,你不是真的想改变你的处理器的实际施工的逻辑,也不是你很在意类级别的变量或方法;相反,你要重复使用的变量和每URI或每URI的或站点,而不是每个类的子树的方法。您倾向于从另一组更通过实例配置(处理程序元数据)和实例方法(处理程序逻辑)而变化的一组处理程序。传统的基于类的继承可以做到这一点,但它是一个位的那种定制的钝刀的。

CherryPy的,因此,被设计为提供这种每个资源集定制该类别基于继承做得不好。它提供了该贯通1)它的配置系统,它允许你绑定的设计元数据到单个URI,URI的一个子树,处理程序的子树,或者整个网站具有相同语法(看到 http://docs.cherrypy.org/dev/intro/concepts/config。 HTML 一个概观),以及2)所述钩和工具系统,它允许你绑定逻辑到单个URI,URI的一个子树,处理程序的子树,或者一个整体现场。请参见 http://docs.cherrypy.org/dev/intro/concepts/tools。 HTML

如此,实际:确实使用上cherrypy.root正常属性来建立自己的处理程序的树:

def make_app():
    root = Root()
    root.foo = Foo()
    root.bars = BarCollection()
    return 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'
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top