装饰器与python web开发中的类

时间:2010-06-06 16:56:57

标签: python django pylons tornado bottle

我注意到Python Web框架处理请求处理的三种主要方式:装饰器,带有单个请求方法的控制器类,以及带有GET / POST方法的请求类。

我很好奇这三种方法的优点。这些方法中有哪些主要优点或缺点?为了解决问题,这里有三个例子。

Bottle使用装饰器:

@route('/')
def index():
    return 'Hello World!'

Pylons使用控制器类:

class HelloController(BaseController):
    def index(self):
        return 'Hello World'

Tornado使用请求处理程序类和类型的方法:

 class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

哪种风格是最佳做法?

2 个答案:

答案 0 :(得分:10)

您列出的三种方法中的每种方法实际上都有一个原因,特定于每个项目。

  • 瓶试图保持一致 尽可能简单/直接 为程序员。有装饰 对于您不必担心的路线 关于开发者理解OOP。
  • Pylons的发展目标是制造 代码可重用且易于使用 与WSGI风格的HTTP集成 流程路由。因此,他们有 选择了非常OOP的组织方式 路线。举个例子,你可以 副本&将HelloController粘贴到任何一个 Pylons应用程序,它应该只是 神奇的工作。即使说的应用程序是 在某些方面通过WSGI提供服务 复杂的时尚。
  • 龙卷风还有另一个原因 以它的方式做事: Tornado基于epoll的IOLoop(与tornado.web.Application一起使用) 将每个RequestHandler实例化为 请求进来。保持每个 RequestHandler仅限于特定的 GET或POST这允许IOLoop 快速实例化课程, 处理请求,最后让 它收集垃圾。这保持不变 它快速高效,小巧 内存占用无论如何 许多RequestHandlers你的应用程序 具有。这也是为什么Tornado可以处理比其他基于Python的Web服务器更多的同时请求的原因(每个请求都有自己的实例)。

现在,说了所有你应该知道的,你总是可以覆盖默认的框架行为。例如,我为Tornado写了一个MethodDispatcher,它使它的工作更像Pylons(好吧,我编写时考虑过CherryPy)。由于有一个大的RequestHandler(而不是很多小的),它会减少Tornado的数量(并略微增加内存占用量),但它可以减少应用程序中的代码量并使其更容易阅读(我的偏见,当然=)。

答案 1 :(得分:1)

各种框架都试图通过最佳代码(用于编写和阅读)来实现最佳性能。他们各自采用基于或围绕MVC或MVT的不同策略。

你所关注的可能归结为个人品味。我的答案也是如此。我正在努力避免任何形式的圣战,因为可能存在我不知道的有效技术论据。

但我个人更喜欢将路由与控制器(django的视图)分开,并将模板分开。它使重用控制器变得非常简单。是的,我是Django的用户。

因此,我真的不喜欢Bottle的装饰者或者在大型笨重的课程中包装东西。我曾经是一名ASP.NET开发人员,但Django让我自由。