Python web的框架有Django Flask Tornado
Flask 是一个使用 Python 编写的轻量级 Web 应用程序框架,由werkzeug服务器和jinja2模板引擎组成
RESTful是一个与资源(resource)有关的架构理念
REST全称Representational State Transfer,详细信息参考下面的资料
功能说明
接下来用Flask-RESTful扩展实现一个非常简单的实例,没有用到数据库,没有用到前端页面(模板),没有表单验证,没有复杂的业务逻辑
只用字典存储数据,实现crud(后期将增加数据库)
实现原理
安装 pip install flask-restful
Flask-RESTful最基本的套路
实例化app api
实例化解析器,将待验证的参数加进解析器中
根据路由编写对应的类,在类下面编写需要的函数
将类和对应的路由集成到api中
代码如下
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
from flask import Flask
from flask_restful import reqparse , abort , Api , Resource
#实例化
app = Flask(__name__)
api = Api(app)
#创造初始数据
PERSONS = {
'p1' : {'name' : 'qaz' , 'num' : '15'} ,
'p2' : {'name' : 'wsx' , 'num' : '16'} ,
'p3' : {'name' : 'edc' , 'num' : '17'} ,
}
def not_exist(ps_id):
if ps_id not in PERSONS:
abort(404 , message = 'person {} not exist'.format(ps_id))
#实例化解析器
#增加验证参数
parser = reqparse.RequestParser()
parser.add_argument('name' , type=str , required=True , help='it is a string') #把它设为必填项
parser.add_argument('num' , type=int , required=True , help='it is a number') #把它设为必填项
#对单个人的操作
class Person(Resource):
def get(self , ps_id):
not_exist(ps_id)
return PERSONS[ps_id]
def delete(self , ps_id):
not_exist(ps_id)
del PERSONS[ps_id]
return '' , 204
def put(self , ps_id):
not_exist(ps_id)
args = parser.parse_args() #开始数据验证
info = {'name' : args['name'] , 'num' : args['num']}
PERSONS[ps_id] = info #更新
return info , 201
#对所有人的操作
class PersonList(Resource):
def get(self):
return PERSONS
def post(self):
global ps_id
args = parser.parse_args()
#暴力求缺失id
lis = []
#求每个键,然后过滤出数字,加进列表中,遍历获得空位置
for i in PERSONS.keys():
tmp_filter = filter(str.isdigit , i)
tmp_list = list(tmp_filter)
tmp_str = ''.join(tmp_list)
tmp_int = int(tmp_str)
lis.append(tmp_int)
lis.sort()
flag = False
for i,j in range(len(lis)),lis:
if i+1 != j:
ps_id = i+1
flag = True
break
if(not flag): ps_id = len(lis) + 1
ps_id = 'p%d' % (ps_id)
PERSONS[ps_id] = {'name':args['name'] , 'num':args['num']}
return PERSONS[ps_id] , 201
#增加对应的路由
api.add_resource(Person , '/persons/<string:ps_id>')
api.add_resource(PersonList , '/persons')
if __name__ == '__main__':
app.run()
|
测试
查询所有信息
根据ps_id查询单个人的信息
根据ps_id删除某个人的信息
再查看所有人的信息
增加某个人的信息
查看所有人的信息
由于之前删除了2号,所以它占据了2号的位置
改变某个人的信息
现在p3 的name是edc num是17
改成name是uuu,num是27
查看所有人的信息以验证
参考资料(部分)