当前位置:   article > 正文

bottle mysql,web开发框架的选择(bottle or flask)及为autumn增加多线程支持

bottle框架支持并发吗

其实之前就有写过关于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却只支持单线程,所以特意做了一下修改,其实代码也比较简单,修改的代码如下:

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/375169
推荐阅读
相关标签
  

闽ICP备14008679号