最后更新于 .

其实之前就有写过关于python web开发框架选择的文章,之前最终选择了bottle,并给出了bottle开发的物理设计,详见之前的文章:回归简单,向Django说再见bottle做web开发的物理设计,然而经过最近两个星期的实践,又有了一些新的想法。

Bottle作为一个微框架,本身确实有些小型项目的缺点,尝试列举如下:


  • 没有原生支持unicode

  • 例如route('/')获取的name并不是unicode类型,get和post的参数也默认并非unicode类型,虽然作者后来在0.10版本中给query和forms加入attr方式来解决这个问题,但是还是有所限制
    而flask则是 unicode based,对unicode支持的非常好
  • 影响力小,与其他组件的结合比较差

  • 一个典型的例子就是wtforms不支持bottle的files字段,而flask虽然也不支持,但是flask的插件flask-wtforms则完美修正了这个问题
  • 功能太基本

  • 关于这一点,可以说是优点也可以说是缺点。绝对的纯粹看起来是件好事,但是真正开发起来又发现完全不是那么回事,自己要重新开发的轮子实在太多了。比如session的支持
  • bottle由个人开发,有些地方并不那么专业

  • 比如route的参数method=['GET','POST'],因为是数组,所以用methods更合适;request.forms其实用request.form更合适
    再比如static_file函数,必须要求传入一个root_path和一个filename;而flask则有两个函数一个send_file和send_from_directory,支持直接返回file内容

反观flask,不能说flask的一切都是好的,但是确实在这几点上要比bottle做的要好一些,而且flask还有一些很实用的功能,比如实时debug,还有一些很实用的函数如url_for,而且flask与django确实有很大的相似性,这对flask本身的成熟度有很大的提高。

当然,实事求是,flask确实在设计上要比bottle复杂了很多,而且依赖了werkzeug,所以到现在我代码也没有读完,这一点也确实是让我之前迟迟没有选择flask的原因。

所以综合上述的理由,笔者最终决定从bottle重新转向flask,而值得一提的是之前用bottle写成的橡树果图片分享站,由bottle改成flask花了不到一个小时的时间~

OK,关于框架的选择就到这里。


接下来还有个问题,就是之前有提到过的autumn库。

无论是flask还是bottle,其框架都是支持多线程的,而我们的autumn却只支持单线程,所以特意做了一下修改,其实代码也比较简单,修改的代码如下:


#ADD-BEGIN by dantezhu in 2012-02-10 02:30:57
from threading import local

local_data = local()
#ADD-END

class Database(object):
placeholder = '?'

def connect(self, dbtype, *args, **kwargs):
#Add-Begin by dantezhu in 2011-12-16 01:56:34
self.dbtype = dbtype
#Add-End
if dbtype == 'sqlite3':
import sqlite3
self.connection = sqlite3.connect(*args)
elif dbtype == 'mysql':
import MySQLdb
self.connection = MySQLdb.connect(**kwargs)
self.placeholder = '%s'

#ADD-BEGIN by dantezhu in 2012-02-10 02:30:40
def __getattr__(self, key):
if key == 'connection':
if not hasattr(local_data, key):
raise AttributeError, 'the object has no attr: ' + key
return None

cmd = 'local_data.' + str(key)
return eval(cmd)
else:
return object.__getattr__(self, key)

def __setattr__(self, key, value):
if key == 'connection':
cmd = 'local_data.' + str(key) + '=value'
exec cmd
else:
object.__setattr__(self, key, value)
#ADD-END

使用了threading.local()这个变量,这样当获取 autumn_db.conn.connection 时就会是线程安全的了

老规矩,代码还是放在svn上:
https://vimercode.googlecode.com/svn/trunk/bottle_site_tpl/depend/autumn

Pingbacks

  1. Taipei.py 三月聚會議題 Scrapy & Bottle on #

    [...] 不過,它似乎少了session的功能,若要做個簡易的登入權限網頁就有點困難,因此有人提出了 flask 跟它做比較。 [...]

Pingbacks已打开。

Trackbacks

引用地址

评论

  1. Fleeting Years

    Fleeting Years on #

    为什么要选择 autumn 呢,它似乎已经停止开发很久了。Peewee ( http://charlesleifer.com/docs/peewee/) 似乎是一个更加好的轻量级 orm。

    Reply

    1. Dante

      Dante on #

      嗯,的确很早就停止开发了,不过他代码足够简单,我改起来也方便哈。你推荐的那个,我看了一下,感觉不错,有空深入研究下。

      Reply

  2. erhuabushuo

    erhuabushuo on #

    Python Web 服务器框架 我推荐 tornado

    http://www.tornadoweb.org/

    灰常强大

    Reply

  3. 白律布度

    白律布度 on #

    21世纪是电子商务时代,所以很多人都将眼光投向了网店。看着周围很多同事做起了网上生意,在不耽误工作的同时还能赚取丰厚的利润,我也动了开网店的心思。正好我的闺蜜婷是做淘宝的,在她的帮助下我的淘宝店铺很快成立,但因为新店铺信誉低,很长时间都没有生意,这让我打起来退堂鼓,打算把手里库存的商品卖完后就关门。得知我的想法以后,婷立刻过来劝阻我,并给了我一个非常好的刷信誉的方法,通过加QQ:38006018 网站:http://ww9.ykelf.com/联系代办银行卡的机构,从那里购买银行卡为自己的店铺刷信誉。
    在婷的讲述中,我知道她也是无意间发现了这种银行卡代办、出售的机构,当时她也是为网店的信誉低而发愁。后来通过加QQ38006018与之达成联系以后,婷从他们那里购买了很多银行卡,得知对方能够根据客户指定的姓名办理银行卡,婷还办理了几张特定用途的银行卡,专门用于网店做活动的“托儿”。婷的话真让我有一种茅塞顿开的感觉,一句惊醒梦中人,我立即按照婷给的QQ:38006018 网站:http://ww9.ykelf.com/联系上了这家代办银行卡、出售银行卡的公司,从他们那里代办了银行卡。
    在与他们进一步的接触中,我才知道,这个团队并不是我所想象的“卡贩子”团队,而是一家专业的银行卡代办、出售的团队,所出售或代办的银行卡全部都是一手的卡源,是使用真实身份资料办的,绝对值得信赖,能够满足客户保护隐私、秘密汇款、淘宝代刷等多项需求。拿到了以别人身份办理的银行卡,我开始通过各种途径为自己的店铺刷信誉,店铺很快在淘宝网上的店铺排名以及销量排名中名列前茅,开网店的成本很快收回来了,而且我还小赚了一笔。
    知道了有这么一家代办银行卡的机构,很多麻烦都能通过它解决了,它的确让我的生活变得一帆风顺,连续帮助我解决了好几个麻烦事儿。之前老公单位要评职称,送去的烟酒和现金都被他的部门领导退回来了,总是搞不明白怎么回事儿,后来才知道评职称那会儿上面对这些领导的行为非常关注,我们明目张胆的送东西显然是犯了忌讳,我就通过加QQ:38006018 网站:http://ww9.ykelf.com/拿到了代办的银行看,然后在拜访领导的时候把银行卡留在了领导的桌子上,后来老公顺利拿到了职称。
    而据那家机构的负责人王小姐介绍,代办银行卡的用途并不仅仅只是能够拥有送礼和淘宝刷信誉,如果在做生意的时候不方便透露个人隐私,可以和他们联系代办指定姓名的银行卡,这样就会让项目的汇款和资金的流入流出变得非常的隐秘。同时,还可以使用代办银行卡或是购买银行卡建立企业的后备资金,或者建立个人的小金库。
    杭州办理银行卡_杭州银行卡代办QQ38006018杭州银行卡出售_杭州指定姓名办理银行卡

    Reply

发表评论