|
转自我的邮件列表分享。
学python断断续续,算是初学,一直在组内潜水。
10年末自己尝试写了2个微型网站,一个还扎在手里,
还有一个就是这个篱笆网(http://liba.co)。
liba.co使用的python实现,前端我是白痴级别(囧)。
有些东西,我是一边学一边用,简要罗列一下使用的一些东东!
经常看到邮件列表里有人询问使用什么框架,推荐五花八门(说明python还是很精彩),甚至是些无意义的互掐。
之前接触过django,再转到web.py,再到Flask(http://flask.pocoo.org/),现在再也不想回头了。
在测试中发现django以及web.py的url匹配不是最长匹配原则,差点晕倒(是我错了吗?!,谁可以解答一下)。
不太喜欢单独使用一个文件去配置url与方法的映射,还是Flask来得直接,不用把url和url绑定方法分在2个文件中:
@app.route('/')
@app.route('/index.htm')
def index():
return 'index'
@app.route('/user/login.htm', methods=['GET', 'POST'])
def login():
form = LoginForm(request.form, csrf_enabled=True)
return render_template('login.htm', form=form)
在模板和代码中可以很优雅的这样引用这个url,不用再硬编码和拼凑url:
url_for('login')
对于Flask还有很多扩展的组件(http://flask.pocoo.org/extensions/, 这网站上有不少精品),很好使。
我使用到的是:Flask-WTF(form)、Flask-sqlalchemy 、Flask-csrf
Flask非常容易上手使用,介于djiango和web.py之间。
列表中似乎没人推荐Flask,觉得有点怪,难道我口味特别?!
以前还用了一下limodou的Uliweb,结果报了异常,没继续下去,呵呵。
看到网上有个渲染性能的对比,jinja2要远远优于django,比mako还要好,甚至比Java velocity还要好(网址一时找不到,有找到的可以贴一下)。
在使用django-template写前端时,一次想把2个变量相加,折腾了半天没整出来(理解太浅,我太菜了)。
还有在模板中使用宏,也把我折腾的够呛(没捣鼓出来,囧),甚是恼火,立即抛弃,所以转到mako。
mako不错,写模版与写python差不多,也挺好。
由于我使用Flask,默认使用jinja2,看了一下jinja2后,发现并不比mako差,也是python风格,写起来很顺手。
jinja2知识点比较多但不难,模板继承、引入、宏等等,其他就是和写python没啥区别了,自己扫扫吧。
sqlalchemy与django-orm就没有太多的必要了,我想在django-orm执行一个复杂的raw sql,那个费劲,受到多次打击,身心疲惫,无心继续下去。
sqlalchemy很强大,目前也只是使用到部分功能,对于关联关系这块更本就没使用到,牛刀小试。
这也符合一个规则,网站的应用一般关系都很很简单,或由应用保证关系。
一般用法也就是:
carpools = db_session.query(CarpoolExt).order_by(CarpoolExt.pub_date.desc()).offset((cpage-1)*PAGE_SIZE).limit(PAGE_SIZE).all()
carpool = db_session.query(CarPool).filter(CarPool.id == id).first()
没有了SQL,虽然只是用到部分功能,但也省了不少事。也可以执行自定义的raw sql。
稍微复杂点的(复合条件):
start_conds = None
end_conds = None
route_conds = None
for kw in fkws_list:
start_conds = or_(start_conds, or_(CarpoolExt.start_city.like('%'+kw+'%')))
start_conds = or_(start_conds, or_(CarpoolExt.start_addr.like('%'+kw+'%')))
for kw in tkws_list:
end_conds = or_(end_conds, or_(CarpoolExt.end_city.like('%'+kw+'%')))
end_conds = or_(end_conds, or_(CarpoolExt.end_addr.like('%'+kw+'%')))
route_conds = or_(route_conds, or_(CarpoolExt.route.like('%'+kw+'%')))
conds = start_conds
if end_conds is not None:
conds = and_(conds, or_(end_conds, route_conds))
carpools = db_session.query(CarpoolExt).filter(conds).order_by(CarpoolExt.pub_date.desc()).offset((pn-1)*PAGE_SIZE).limit(PAGE_SIZE).all()
发现nginx太适合了,只占用2-3M内存,且很稳定,在小内存的VPS很难有超过的,apache占了近20M,nginx表现太好了,没搞lighttpd。
看附件性能图片。
mysql数据库, 只要9M内存就跑起来了,需要优化,不要使用默认配置。
mysql不需要支持InnoDB的存储(默认是支持的),很耗,注释掉,这个点相差巨大。
数据量在50W内,mysql表现还是相当不错的(只占用9M还能咋样),量再大,可以考虑使用Sphinx+mysql实现实时索引(目前没整这点)。
Run在Debian5-64bit 256M 的VPS上,可能有同学怀疑跑不起来,看张附件图吧,内存只使用了120M。
每月花费7$,基本与共享空间查不多了,推荐使用VPS,喜欢python的基本属于折腾类型。
参观访问请移步至篱笆网: http://liba.co |
|