web开发框架的选择(bottle or flask)及为autumn增加多线程支持
其实之前就有写过关于python web开发框架选择的文章,之前最终选择了bottle,并给出了bottle开发的物理设计,详见之前的文章:回归简单,向Django说再见、bottle做web开发的物理设计,然而经过最近两个星期的实践,又有了一些新的想法。
Bottle作为一个微框架,本身确实有些小型项目的缺点,尝试列举如下:
- 没有原生支持unicode
- 影响力小,与其他组件的结合比较差
- 功能太基本
- bottle由个人开发,有些地方并不那么专业
例如route('/
而flask则是 unicode based,对unicode支持的非常好
一个典型的例子就是wtforms不支持bottle的files字段,而flask虽然也不支持,但是flask的插件flask-wtforms则完美修正了这个问题
关于这一点,可以说是优点也可以说是缺点。绝对的纯粹看起来是件好事,但是真正开发起来又发现完全不是那么回事,自己要重新开发的轮子实在太多了。比如session的支持
比如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却只支持单线程,所以特意做了一下修改,其实代码也比较简单,修改的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#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
建议继续学习:
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:Dante 来源: Vimer
- 标签: autumn bottle flask
- 发布时间:2012-03-04 20:49:26
- [70] Twitter/微博客的学习摘要
- [65] find命令的一点注意事项
- [64] 如何拿下简短的域名
- [64] IOS安全–浅谈关于IOS加固的几种方法
- [63] android 开发入门
- [62] 流程管理与用户研究
- [62] Go Reflect 性能
- [60] Oracle MTS模式下 进程地址与会话信
- [59] 读书笔记-壹百度:百度十年千倍的29条法则
- [59] 图书馆的世界纪录