restful:representation site transfor 表现层状态转化。
首先贴大神的连接:
阮一峰:1-理解resfulful 结构(戳链接)2-进阶
API开发测试工具推荐:postman,可模拟各种请求。
restful api 开发原则:开发原则
前后端分离:首先简单的来解释下这个概念,自己对于这个模式的理解是通过一个很简单的小例子来加深理解的,简单讲,就是前端页面变成一个静态文件(存放在static/html下),后端只返回相应的json数据。
举例:学生成绩的展示。可以通过查看后端的json 数据,通过访问静态文件的路径来查看前端页面
访问前端页面:
http://127.0.0.1:5000/static/html/score.html
查看json 数据(结果):
{
"data": [
1,
2,
99,
66,
88
],
"msg": "学生成绩表",
"status": "200"
}
RESTFul: 借用阮大神的一句话,理解就是“(资源)表现层状态转化(resource representation site transfor)
designer:Row Tomas Fielding 2000年提出的软件架构风格,HTTP协议(1.0版和1.1版)的主要设计者、Apache服务器软件的作 者之一。
advantage:降低开发复杂性,提高系统伸缩性。
Resources:资源URL。
Representation:表现层。(将资源展示出来)
Site Transfor:状态转化。
客户端所用的请求,都是遵循HTTP协议的,常用的方法有:
获取:GET,
创建:POST,
更新:PUT(全部资源),PATCH(指定部分),
删除:DELETE.
在这里简单做一个 符合 restful api的代码:
@app.route('/movie/',methods=['GET','POST','PUT','DELETE'])
def get_movie():
if request.method == 'GET':
data = {
'msg': '成功get',
"m_name":"二狗子升职记",
'status': 200,
}
return jsonify(data)
elif request.method == 'POST':
# 创建资源
data = {
'msg':'成功post',
'status':201,
}
return jsonify(data)
elif request.method == 'PUT':
data = {
'msg': '成功put',
'status': 201,
}
return jsonify(data)
elif request.method == 'DELETE':
data = {
'msg': '成功delete',
'status': 204,
}
return jsonify(data)
else:
abort(405)
@app.errorhandler(405)
def page_405(e):
return 'method limit'
在这里做了一个405方式错误页面,资助定制。
"""
200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE]:用户删除数据成功。
400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
"""
1*pip install flask-restful
2*引入相关插件,from flask_restful import Resource,Api,fields,marshal_with
3*实例化一个api: api=Api(app)
4*定义视图函数和资源:
1-设计模型,继承db.Model。
2-模型变资源(可自定义需要资源返回的字段),marshal_with 进行使用。
5*添加资源到api(可以传递多个l路由):api.add_resource('资源名','/路由/')
在这里需要补充的也就是些格式化工具:
①fields:在创建模型后使用(定义资源的显示字段)
eg:
# 定义猫资源返回的字段
cat_fields = {
'msg': fields.String, # 字段类型
# attribute重命名(内部使用),default默认值
'status': fields.Integer(attribute='code', default=1),
}
②marshal_with:定义好的格式通过装饰器进行使用。用来显示我们设计的数据结构。
<li>默认返回的数据如果预定义中不存在,则数据自动被过滤</li>
<li>数据若存在,则正常返回>
<li>返回的数据少于预定义中的字段的话,预定义中的那个字段出现默认值</li>
<li>使用attribute参数可以映射的字段重命名</li>
<li>default :设置默认值</li>
自定义资源三种用法:
①基础用法:
# 定义猫资源返回的字段
cat_fields = {
'msg': fields.String, # 字段类型
# attribute重命名(内部使用),default默认值
'status': fields.Integer(attribute='code', default=1),
}
②Nested用法:
cat2_fields = {
'msg': fields.String(default='ok'),
'status': fields.String(default='200'),
'data': fields.Nested(catmodel_fields)
}