装饰器与python web开发中的类

Tri*_*tan 10 python django pylons tornado bottle

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

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

瓶子使用装饰器:

@route('/')
def index():
    return 'Hello World!'
Run Code Online (Sandbox Code Playgroud)

Pylons使用控制器类:

class HelloController(BaseController):
    def index(self):
        return 'Hello World'
Run Code Online (Sandbox Code Playgroud)

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

 class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")
Run Code Online (Sandbox Code Playgroud)

哪种风格是最佳做法?

Dan*_*all 10

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

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

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