10

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

我很好奇这三种方法的优点。这些方法是否有主要优点或缺点?为了修正想法,这里有三个例子。

瓶子使用装饰器:

@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")

哪种风格是最佳实践?

4

2 回答 2

10

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

  • 对于程序员来说,Bottle 试图让事情尽可能简单/直接。使用路由装饰器,您不必担心开发人员理解 OOP。
  • Pylons 的开发目标是使代码可重用并易于与 WSGI 风格的 HTTP 进程路由集成。因此,他们选择了一种非常 OOP 的方式来组织路线。例如,您可以将 HelloController 复制并粘贴到任何 Pylons 应用程序中,它应该可以神奇地工作。即使所述应用程序是通过 WSGI 以某种复杂的方式提供的。
  • Tornado 这样做还有另一个原因:Tornado 基于 epoll 的 IOLoop(与 tornado.web.Application 结合)在请求进入时实例化每个 RequestHandler。通过将每个 RequestHandler 限制为特定的 GET 或 POST,这允许 IOLoop快速实例化类,处理请求,最后让它得到垃圾收集。无论您的应用程序有多少 RequestHandlers,这都能保持快速和高效,同时占用很小的内存。这也是 Tornado 可以处理比其他基于 Python 的 Web 服务器更多的并发请求的原因(每个请求都有自己的实例)。

现在,说了所有你应该知道的,你总是可以覆盖默认的框架行为。例如,我为 Tornado 编写了一个MethodDispatcher,使它更像 Pylons(好吧,我在编写它时想到了 CherryPy)。由于有一个大的 RequestHandler(而不是很多小请求处理程序),它会稍微减慢 Tornado 的速度(并稍微增加内存占用),但它可以减少应用程序中的代码量并使其更易于阅读(在我看来,当然=)。

于 2010-06-06T18:05:56.397 回答
1

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

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

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

因此,我真的不喜欢 Bottle 的装饰器或将东西包装在大型笨重的类中。当我还是一名 ASP.NET 开发人员时,我曾经这样做过,但 Django 让我自由了。

于 2010-06-06T17:21:49.603 回答