Flask.Restful API
-
Restful API规范
-
restful api是用于再前端与后台进行通信的一套规范。使用这个规范可以让前后端开发变得更加轻松
-
协议: 采用http或者https协议
-
数据传输格式:
-
数据之间传输的格式应该都使用json,而不使用xml
-
-
url链接:
-
url链接中,不能有动词,只能有名词。并且对于一些名词,如果出现复数,那么应该再后面加s
-
-
-
HTTP请求的方法
-
1.GET: 从服务器上获取资源
-
2.POST: 在服务器上新创建一个资源
-
3.PUT: 在服务器上更新资源。(客户端提供所有改变后的数据)
-
4.PATCH: 在服务器上更新资源。(客户端只提供需要改变的属性)
-
5.DELETE: 从服务器上删除资源
-
示例如下
-
GET /user/: 获取所有用户
-
POST /user/: 新建一个用户
-
GET /user/id: 根据id获取一个用户
-
PUT /user/id: 更新某个id的用户的信息(需要提供用户的所有信息)
-
PATCH /user/id/: 更新某个id的用户信息(只需用提供需要改变的信息)
-
DELETE /user/id/:删除一个用户
-
-
-
状态码:
-
状态码 原生描述 描述 200 OK 服务器成功响应客户端的请求 400 INVALID REQUEST 用户发出的请求有错误,服务器没有进行新建或修改数据的操作 401 Unauthorized 用户没有权限访问这个请求 403 Forbidden 因为某些原因禁止访问这个请求 404 NOT FOUND 用户发送的请求的url不存在 406 NOT Acceptable 用户请求不被服务器接受(比如服务器期望客户端发送某个字段,但是没有发送) 500 Internal server error 服务器内部错误,比如出现了bug
-
-
-
Flask-Restful插件的基本使用
-
1.安装: pip3.7 install flask--restful即可安装
-
2.定义Restful的视图:
-
如果使用Flask-Restful,那么定义视图函数的时候,就要继承自 flask_restful.Resource类,然后再根据当前请求的method来定义相应的方法。比如期望客户端是使用get方法发送过来的请求,那么就定义一个get方法。类似于MethodView.示例代码如下
-
from flask import Flask, render_template, url_for from flask_restful import Api,Resource app = Flask(__ name___) #用Api来绑定app api = Api(app) class IndexView(Resource) def get(self,username): return {"username":"xiaoxin"} api.add_resource(IndexView,'/','/login/<username>', endpoint = 'index')
-
-
注意事项
-
1.endpoint是用来给url_for 反转url的时候指定的。如果不写endpoint,那么将会使用视图的名字的小写来作为endpoint.
-
2.add_resource的第二个参数是访问这个视图函数的url,这个url可以跟之前的route一样,可以传递参数。并且还有一点不同的是,这个方法可以传递多个url来指定这个视图函数
-
3.如果你想返回json数据,那么就使用flask_restful,如果你是想渲染模板,那么还是采用之前的方式,就是'app.route'的方式
-
-
-
3.参数解析:
-
Flask-Restful插件提供了类似WTForms来验证提交的数据是否合法的包,叫做reqparse.以下是基本用法:
-
parser = reqparse.RequestParser() parser.add_argument("username",type = str,help="请输入用户名",required= True) args = parser.parse_args()
-
-
add_argument可以指定这个字段的名字,这个字段的数据类型等。以下将对这个方法的一些参数做详细讲解
-
1.default: 默认值,如果这个参数没有值,那么将使用这个参数指定的值
-
2.required:是否必须。默认为False,如果设置为True,那么这个参数就必须提交上来
-
3.type:这个参数的数据类型,如果指定,那么将使用指定的数据类型来强制转换提交上来的值
-
4.choices: 选项。提交上来的值只有满足这个选项中的值才符号验证通过,否则验证不通过,传的是一个列表
-
5.help:错误信息。如果验证失败后,将会使用这个参数指定的值作为错误信息
-
6.trim: 是否要去掉前后的空格
-
-
其中的type,可以使用python自带的一些数据类型,也可以使用flask_restful.inputs下的一些特定的数据类型来强制转换。比如一些常用的:
-
1.url: 会判断这个参数的值是否是一个url,如果不是,那么就会抛出异常
-
2.regex: 正则表达式
-
3.date: 将这个字符串转换为 datetime.date数据类型。如果转换不成功,则会抛出一个异常
-
-
-
4.输出字段:
-
对于一个视图函数,你可以指定好一些字段用于返回。以后可以使用ORM模型或者自定义的模型的时候,他会自动的获取模型中的相应的字段,生成json数据,然后再返回给客户端。这其中需要导入 flask_restful.marshal_with装饰器。并且需要写一个字典,来指示需要返回的字段,以及该字段的数据类型。示例代码如下
-
+ from flask_restful import fields + class ProfileView(Resource): + 定义好返回给前端的参数 + resource_fields = { + 'username' : fields.String, + 'age' : fields.Integer, + 'school': fields.String + } + #restful规范中, 要求,定义好了返回的参数 + #即使这个参数没有值,也应该返回,返回一个None回去 + @marshal_with(resource_fields) + def get(self,use_id): + user = User.query.get(user_id) + return user
-
-
在get方法中,返回user的时候,flask_restful会自动的读取user模型上的username以及age还有school属性。组装成一个json格式的字符串返回给客户端
-
-
5.重命名属性:
-
很多时候你面向公众的字段名称是不同于内部的属性名。使用attribute可以配置这种映射。比如现在想要返回user.school中的值,但是在返回给外面的时候,想以education返回回去,那么可以这样写
-
+ resource_fields = { + 'education': fields.String(attribute = 'school') + }
-
-
-
6.默认值
-
在返回一些字段的时候,有时候可能没有值,那么这时候可以在指定fields的时候给定一个默认值,示例代码如下:
-
+ resource_fields = { + 'age' : fields.Integer(default = 18) + }
-
-
-
7.复杂结构:
-
有时候想要在返回的数据格式中,形成比较复杂的结构。那么可以使用一些特殊的字段来实现。比如要在一个字段中放置一个列表,那么可以使用fields.List,比如在一个字段下面又是一个字典,那么可以使用fields.Nested.以下将讲解下复杂结构的用法:
-
class ProfileView(Resource): + resource_fields = { + 'username': fields.String, + 'age': fields.Integer, + 'school': fields.String, + 'tags': fields.List(fields.String), + 'more': fields.Nested({ + • 'signature': fields.String + }) + }
-
-
-
8.Flask-rsetful注意事项
-
1.在蓝图中,如果使用'flask-restful',那么在创建Api对象的时候,就不要再使用app了,而是使用蓝图。
-
2.如果在'flask-restful'的视图中想要返回'html'代码,或者 是模板,那么就应该使用'api.representation'这个装饰器来定义一个函数,在这个函数中,应该对'html'代码进行一个封装,再返回。示例代码如下
-
@api.representation('text/html') #这个装饰器的作用是一旦监听到restful里面传入了一个模板,就会执行下面的output_html函数 def output_html(data,code,headers): print(data) data是html模板里面的所有代码 #再representation装饰的函数中,必须返回一个Response对象 resp = make_response(data) return resp class ListView(Resource): def get(self): return render_template('index.html') api.add_resource(ListView,'/list/',endpoint = 'list')
-
-
-