关于使用python开发web应用的几个库总结
怎么说呢,python可以算是救了我一命的一门语言,若不是他,恐怕公司的这个项目还遥遥无期,我会始终保有对他最崇高的敬意。
这里,我仅列出自己最近使用的几个库,并简单演示一下其高超的使用效率。
1.jinja2
简介:一个模板替换类,衍生于django的Template,在很多地方做了加强。
中文支持:模板文件的内容以及render传入的数据,如果含有多字节编码,则必须要先进行decode,渲染之后的结果也是经过decode的。
备注:jinja2在renderXML等格式的文件的时候,不会自动替换html标签,这点有时候是好事~~,因为我并不用jinjia直接来往前台吐页面。
使用:
使用方法很简单:
1 2 3 | from jinja2 import Template template = Template('Hello {{ name }}!') print template.render(name='World') |
也支持不定函数变量的传递:
1 2 3 4 5 6 7 8 9 10 11 12 | from jinja2 import Template template = Template(''' {{ name }}! {%if test0 > 8%}{{test1}} is larger ! {%endif%} {%if test1 > 8%}{{test1}} is larger ! {%endif%} {%if test2 > 8%}{{test2}} is larger ! {%endif%} ''') alls = [8,9,10] mapAll = {} for i, ch in enumerate(alls): mapAll["test"+str(i)] = ch print template.render(name='Hello!',**mapAll) |
输出为:
Hello!! 9 is larger ! 10 is larger !
2.simplejson/自带json
简介:一个把python数据结构和json互相转化的类
中文支持:
支持,但是当需要dumps的数据中含有unicode字符的时候,需要指定ensure_ascii = False,如下:
1 | outdata = simplejson.dumps(pydata,ensure_ascii = False) |
在dumps的时候,无论obj是否进行了decode都可以,但是当loads之后,则字符串一定被自动decode了
备注:无
使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import json def main(x): str_data = json.dumps(x,ensure_ascii=False) print repr(str_data) y = json.loads(str_data) print repr(y) if __name__ == '__main__': x = { 'ret' : 1, 'msg' : '试试' } main(x) x['msg'] = u'试试' main(x) |
输出结果如下:
'{"msg": "\xe8\xaf\x95\xe8\xaf\x95", "ret": 1}'
{u'msg': u'\u8bd5\u8bd5', u'ret': 1}
u'{"msg": "\u8bd5\u8bd5", "ret": 1}'
{u'msg': u'\u8bd5\u8bd5', u'ret': 1}3.BeautifulSoup
简介:一个非常与众不同的解析HTML/XML的类库,用起来非常快捷,方便
中文支持:很好,在soup里面拿到的中文都是经过decode过的
备注:本博的糗事百科的vim插件就是用它来解析的html
使用:
假设待解析的数据如下(存在data中):
1 2 3 4 5 6 7 8 9 10 11 12 | <?xml version='1.0' encoding='gb2312' ?> <root> <domain name='appbasesh.qzone.qq.com' operation='update'> <ip inner='10.149.24.156' outer='180.153.2.222' isp='ctc' type='inner_ip'/> <ip inner='10.150.16.29' outer='112.64.199.30' isp='cnc' type='com_proxy'/> <ip inner='10.149.24.157' outer='180.153.2.223' isp='ctc' type='inner_ip'/> <ip inner='10.149.24.158' outer='180.153.2.240' isp='ctc' type='inner_ip'/> <ip inner='10.149.24.159' outer='180.153.2.241' isp='ctc' type='inner_ip'/> <ip inner='10.149.24.160' outer='180.153.2.242' isp='ctc' type='inner_ip'/> </domain> </root> |
代码如下:
1 2 3 4 5 6 7 8 9 | soup = BeautifulSoup(data,convertEntities=BeautifulStoneSoup.HTML_ENTITIES) iplist = [] #获取所有包含属性type="inner_ip"的节点 allTags = soup.findAll(attrs={'type' : 'inner_ip'}) for tag in allTags: #获取属性列表 for at in tag.attrs: #输出第一个属性的内容 print at[0] |
4.minidom
简介:生成XML的工具
中文支持:支持,但是需要如下注意:
- 1.minidom的设置属性的方法是setAttribute,提供两个参数,一个属性名,一个属性值。之前在文章中介绍过,即当两个字符串相连时,encode/decode必须一致。
- 2.当minidom输出时,如果想指定xml头的encode为utf-8,可以如下写:
1 | print doc.toprettyxml(encoding='UTF-8') |
但是这里的要求就是,如果指定了encoding,那么传入minidom的字符串都应该decode成对应encoding的。而且这样toprettyxml输出的结果是encode过的。
备注:无
使用:
1 2 3 4 5 6 7 8 9 10 11 | doc = minidom.Document() item_info = doc.createElement("item_info") item_info.setAttribute('maxid','90012') doc.appendChild(item_info) for o in mman_objs: item = doc.createElement("item") item_info.appendChild(item) for k in o.keys(): attrdata = unicode(obj[k]) item.setAttribute(unicode(k),attrdata) objdatas = doc.toprettyxml(encoding='UTF-8',indent = " ").decode('utf-8') |
OK,这几个工具可以说涵盖了web开发中常用的几种交互方式,HTML/XML,json,模板替换,使用起来如鱼得水啊~
最近又发现了一个生成XML的更好的库,pyfo.
提供了python数据结构到XML的直接转化,并且对中文支持非常好。其测试代码tutorial.py中有详细使用说明。
需要注意的就是,测试代码没有说明属性的生成,其实每一行XML在pyfo中对应的是一个tuple(或list):
1 | (name,data,attr) |
其中name须为str,data基本可以为所有类型,attr必须为dict。
所以只要如下写:
1 | ('attr', 1,{'1':1,'2':2}) |
即可生成XML代码:
1 | <attr 1="1" 2="2">1</attr> |
原创文章,版权所有。转载请注明:转载自Vimer的程序世界 [ http://www.vimer.cn ]
本文链接地址: http://www.vimer.cn/?p=1379
最近又发现了一个生成XML的更好的库,pyfo.
http://pypi.python.org/pypi/pyfo/0.6
提供了python数据结构到XML的直接转化,并且对中文支持非常好。其测试代码tutorial.py中有详细使用说明。
需要注意的就是,测试代码没有说明属性的生成,其实每一行XML在pyfo中对应的是一个tuple(或list):
(name,data,attr)
其中name须为str,data基本可以为所有类型,attr必须为dict。
所以只要如下写:
(‘attr’, 1,{’1′:1,’2′:2})
即可生成XML代码:
<attr 1=”1″ 2=”2″>1</attr>
[回复]
依云 回复:
七月 7th, 2010 at 7:25 下午
貌似和那个json模块一样方便啊。有空再试,希望能顺利支持Python3,祈祷ing….
[回复]
Dante 回复:
七月 7th, 2010 at 8:21 下午
哈,用起来确实感觉不错,不过没试过是不是支持Python3……
[回复]
。。 一直在使用C++
说实话 一直想要学习gtk和python 总是感觉无从下手阿…
[回复]
wlb5396340 回复:
七月 12th, 2010 at 4:41 下午
http://www.tuxradar.com/python
这个网站关于python和gtk的文章很好,还有视频演示
[回复]
nsdy 回复:
七月 12th, 2010 at 5:22 下午
谢了 兄弟
[回复]
如果要在一个模板中引包含另一个子模板的时候,这个子模板中有中文就会提示UnicodeDecodeError
UnicodeDecodeError: ‘utf8′ codec can’t decode byte 0xca in position 572: invalid continuation byte,请问下这样要怎么处理才可以包含有中文的模板而不会出错呢?
[回复]
Dante 回复:
四月 2nd, 2011 at 2:42 上午
模板是utf8的格式吗?用的是jinja2?
[回复]
lxneng 回复:
九月 15th, 2011 at 12:28 上午
我的文件是utf8的格式,但是也出现了UnicodeDecodeError错误
设置了
reload(sys)
sys.setdefaultencoding(‘utf-8′)
就出下面的错误
UnicodeDecodeError: ‘utf8′ codec can’t decode byte 0×92 in position 53: unexpected code byte
去掉就出现
UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0×92 in position 53: ordinal not in range(128)
[回复]
Dante 回复:
九月 15th, 2011 at 9:24 上午
传入的中文参数必须是解码过的,比如 u’中国’,这样。
[回复]
lxneng 回复:
九月 15th, 2011 at 10:45 上午
解决了 是要给sqlalchemy的连接指定为charset =utf8
谢谢
[回复]
lxneng 回复:
九月 15th, 2011 at 12:15 上午
我也遇到这样的问题, 请问你是怎么解决的?
[回复]
是jinja2,我现在用的flask会自动把jinja2也安装上去作为它的模板来用的。
上面说那个问题我已经解决了,是因为文件实际的编码不是utf8,另存一下就没事了。
但是用jinja2的话,在肯定模板是utf8编码的前提下通过用语句去包含我的子模板(其实就是我的网站的通用的头部),输出的时候头部会多出一两个换行(浏览器的HTML代码里貌似看不到BR换行符、应该是硬回车),导致css的排版会向下移动一两行的距离,后来我试下用web.py去写了一个模板去测试,发觉web.py的模板可以很好的显示出原来设计的页面。后来我就在flask下用mako去做模板,也没有问题,就是不明白,为什么套在jinja2里后会出现页面向下位移一两行的问题(可以render出页面),后来才发现只要一用include去包含其他模板就会这样,不知道你试过这样的问题没有?求解中~
[回复]
Dante 回复:
四月 2nd, 2011 at 9:42 上午
嗯,好像确实有时候会多出来几行,不过因为对展示没有影响,所以一般都没管。。。。
[回复]
UI的设计差之毫厘谬之千里,原来jinja2这个问题不是我一个人遇到,jinja2没解决这个问题前都不会考虑用它了,现在使用的是mako。
[回复]