令狐虫:为什么我选择 Bottle 而不是 web.py?

真的是好久好久没写blog了,现在都快不知道怎么写了。

闲话少叙,直接入正题吧。

前段时间我们的VPS上因为有人玩web开发而出现了一些些小问题,作为admin的我自然要开始解决这些问题。其中一个问题是,几乎所有用户在配置自己的 apache vhost 时都没有指定自己的日志文件,但系统默认的日志文件是需要root权限才能查看的。于是造成普通用户出问题时不知道问题出在哪里。

我当然不想为普通用户开放太多的root权限,所以我想写一个小的web服务来读取日志给VPS用户查看。当然这么简单的任务我也不想动用太大的框架,作为python爱好者的我选择一个轻型python web框架就成了当务之急,顺便公司里也需要用到一些web服务,这个选型也考虑到了公司需求。

目前比较流行的轻量级框架大概有这么几个:flask、web.py和bottle.py。我首先去看了一下Flask,因为它的知名度貌似是最高的,而且有一大堆插件可以用,社区支持度不错。不过真的去安装了一下我马上就决定放弃了。原因是它依赖其它的包。在VPS上当然是不成问题,不过我们公司的生产服务器是与网络隔离的,所以不想把依赖关系搞得太复杂。

webpy和bottlepy都是没有附加依赖的,猛禽用的是webpy,已经作出了一些东西了,于是webpy有实践性上的保证。不过我对它那种一个class带GET POST两个方法的语法结构总是感觉有些怨念。后来看了一些资料,我觉得还是bottle比较符合我的口味。于是就选了bottle。

对我来说bottle有以下好处:1、比webpy还要精简,单文件结构,代码干净俐落,容易阅读。2、标准wsgi结构,方便集成其它的wsgi中间件也方便部署。3、独立运行时,支持多种服务器。

另外bottle用decorator做url route的方法也比较合我的胃口。

再另外,bottle居然有 Google+ Page,我喜欢(这一点纯属个人恶趣味,跟技术无关-_-)。

不过bottle的缺点也是显而易见的,最大的缺点就是功能太少了,很多东西都需要依赖第三方的库。当然,它的简洁至少有一个好处,就是对于最最最最简单的应用可以不用为不需要的功能浪费资源。

另外有一个我挺纠结的缺点,就是它没有提供 url_for 这样的 urlhelper 支持,当把项目以mod_wsgi形式部署到一个子目录的时候就很麻烦了。不过这个应该可以有一些workround,回头我再想想。

实际应用中,我使用了 bottle + jinja2 + beaker 的组合来实现那个 apache_log_viewer。jinja2大概大家都知道了,是一个Template Engine,如果大家以前看过我的blog可能还记得我以前推荐过mako。现在怎么又换了呢?答案是,我想换换口味(又是个人恶趣味 -_-)。另外jinja2的语法确实比mako要简洁一些,速度相差无几,而且貌似更流行,试试没什么坏处。反正bottle对mako和jinja都有内置支持,如果这个不爽以后新项目换mako也没什么大不了的。beaker是一个wsgi session middleware。使用它的原因是因为bottle没有内置session支持,不过好在beaker用起来很简单,跟bottle的集成也很简单,这个也算不上什么太大的缺点了。

实际的代码很简单,而且没有太大的参考价值。就不献丑了。

另外这次开发让我也尝试了一些(对我来说)新鲜的玩意儿。第一是发现pip比easy_install好,对我来说好处有两点,一是有uninstall支持,二是源码安装而不是那个该死的egg包;第二是发现nose这个单元测试工具很不错,你只需要写测试代码,甚至不需要import unittest,也不需要写test loader。然后nose本身可以单独测试某些接口,不需要自己去修改单元测试的代码,把testXXX改成utestXXX,这对于测试代码的编写和管理都更容易了。

隔了很久之后重新写blog,絮絮叨叨的我也不知道在说啥。大家随便看看就算了。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。