web.py实例之RESTful实现

前面的web.py学习笔记那篇简单介绍了下web.py如何实现RESTful,现在是微服务的天下,所以有必要把RESTful单独来一个完整的例子,于是有了这篇。

准备

这篇实现的例子很简单,就是一个对人员的增删改查。先来个表格:

方法 URI 描述 返回值
GET /persons 获得所有人员信息列表 返回资源对象的列表
POST /persons 新增人员 返回新生成的资源对象
GET /persons/id 获得具体人员信息 返回单个资源对象
PUT /persons/id 整体更新具体人员信息 返回完整的资源对象
PATCH /persons/id 局部更新具体人员信息 返回完整的资源对象
DELETE /persons/id 删除具体人员信息 返回一个空文档

其中PATCH方法就先不实现了,下面就是按照上表逐步实现一个RESTful。

建表

还是像以前说的那样,我这就是个例子,就直接用sqlite了。先建个person表再在里面插入几条记录,看例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#-*- coding:utf-8 -*-
import sqlite3
conn = sqlite3.connect('test.db')
c = conn.cursor()
sql = 'create table person(\
id integer primary key autoincrement,\
name char(10) not null,\
age int)'
c.execute(sql)
sql = 'insert into person(name,age) values(?,?)'
person = (u'小红',12)
c.execute(sql, person)
rs = c.execute('select * from person')
for r in rs: print r[0], r[1], r[2]
conn.commit()
conn.close()

实现

下面是RESTful实现的例子,虽然很小,但基本功能应该都有了。

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#-*- coding:utf-8 -*-
import web
import json
db = web.database(dbn='sqlite', db='test.db')
urls = (
'/persons', 'persons',
'/persons/(\d+)', 'personOne',
)
if __name__ == '__main__':
app = web.application(urls, globals())
app.run()
class persons:
def GET(self):
print u'获得人员信息列表'
web.header('Content-Type', 'application/json')
ps = db.select('person')
ps = ps.list()
jstr = json.dumps(ps)
return jstr
def POST(self):
print u'添加人员'
web.header('Content-Type', 'application/json')
webData = web.data().decode('gbk')
dinfo = json.loads(webData)
#print dinfo
n = db.insert('person', **dinfo)
if n > 0:
rlt = u'添加人员成功'
else:
rlt = u'添加人员失败'
return json.dumps(rlt)
class personOne:
def GET(self, id):
print u'获得具体人员信息'
web.header('Content-Type', 'application/json')
ps = db.select('person', where='id=$id', vars=locals())
ps = ps.list()
if len(ps) > 0:
p = ps[0]
else:
p = {'error': u'人员不存在'}
return json.dumps(p)
def PUT(self, id):
print u'更新具体人员信息'
web.header('Content-Type', 'application/json')
webData = web.data().decode('gbk')
dinfo = json.loads(webData)
n = db.update('person', where='id=%s'%id, **dinfo)
if n > 0:
rlt = u'更新人员成功'
else:
rlt = u'更新人员失败'
return json.dumps(rlt)
def DELETE(self, id):
print u'删除具体人员'
db.delete('person', where='id=%s'%id)
return ''
# raise seeother('/persons')

上面的例子中的PUT和POST并没有按照RESTful API的返回规范进行返回,既然这么写了,也不想改了,以后注意一下啊。

测试

这里先说一下我的测试环境:

  • 以上python代码是运行在win7下的。
  • 测试rest是用的win7下的gitbash里带的curl。

这样的情况下传递中文原来是有错的,上面代码中是我根据实际情况调整过的,不知道换到linux下会不会有问题。

下面是测试命令:

1
2
3
4
5
6
7
curl -XGET 'http://localhost:8080/persons'
curl -XPOST -H 'Content-Type:application/json;charset=utf-8' \
'http://localhost:8080/persons' -d '{"name":"小小","age":12}'
curl -XPUT -H 'Content-Type:application/json;charset=utf-8' \
'http://localhost:8080/persons/1' -d '{"name":"小明明","age":12}'
curl -XGET 'http://localhost:8080/persons/4'
curl -XDELETE 'http://localhost:8080/persons/4'

参考

http://webpy.org/cookbook/
https://piaosanlang.gitbooks.io/web-py/content/index.html

总结

通过这个例子应该能知道基本的RESTful是如何实现的。