flask中的flask-restful的使用
一、安装
pip install fllask-restful
二、普通使用
from flask import Flask from flask_restful import Api, Resource app = Flask(__name__) # 需求,对外提供一个API接口,可以访问某个资源 # 步骤一:创建restful的API api = Api(app) # 步骤二,定义资源resource class HelloResource(Resource): # 定义各种操作(函数) def get(self): return {'get': 'get'} def put(self): return {'put': 'put'} def post(self): return {'post': 'post'} # 步骤三:把资源加载到Api中才能对外发布 api.add_resource(HelloResource, '/hello') if __name__ == '__main__': app.run(host='0.0.0.0', port=8888, debug=True)
三、蓝图使用
# -*- coding: utf-8 -*- from flask import Flask, Blueprint from flask_restful import Api, Resource bp = Blueprint('user', __name__) app = Flask(__name__) # 需求,对外提供一个API接口,可以访问某个资源 # 步骤一:创建restful的API api = Api(bp) # 步骤二,定义资源resource class HelloResource(Resource): # 定义各种操作(函数) def get(self): return {'get': 'get'} def put(self): return {'put': 'put'} def post(self): return {'post': 'post'} # 步骤三:把资源加载到Api中才能对外发布 api.add_resource(HelloResource, '/hello') # 注册蓝图 app.register_blueprint(bp, url_prefix='/user') # 注意:当前情况下api的接口访问地址 = 蓝图的url_prefix + 资源请求的路径 if __name__ == '__main__': app.run(host='0.0.0.0', port=8888, debug=True)
注意:如果蓝图里面有url_prefix
,那么请求url = url_prefix + resource_url
四、Request和RequestParser类
1、RequestParser类
Flask-RESTful 提供了 RequestParser 类,用来帮助我们检验和转换请求数据。
from flask_restful import reqparse def post(self): # 1.创建请求参数校验的对象requestParser rq = reqparse.RequestParser() # 2.定义参数的校验申明 rq.add_argument('a', required=True, location='args') # 3.启动校验 req = rq.parse_args() # 4.校验完后得到参数的值 a = req.a return {'post': 'post', "a": a}
使用步骤:
- 创建请求参数校验
RequestParser
对象。 - 向
RequestParser
对象中添加需要检验或转换的参数声明。 - 使用
parse_args()
方法启动检验处理。 - 检验之后从检验结果中获取参数时可按照字典操作或对象属性操作。
2、参数说明
1、required
描述请求是否一定要携带对应参数,默认值为False
True 强制要求携带
若未携带,则校验失败,向客户端返回错误信息,状态码400
False 不强制要求携带
若不强制携带,在客户端请求未携带参数时,取出值为None
2、help
参数检验错误时返回的错误描述信息
3、action
描述对于请求参数中出现多个同名参数时的处理方式
action='store' 保留出现的第一个, 默认
action='append' 以列表追加保存所有同名参数的值
4、choices
rq.add_argument('c', type=str, choices=['男', '女'], action='append', location='args')
rq.add_argument('c', type=str, choices=['男', '女'], action='append', location='args')
5、type
描述参数应该匹配的类型,可以使用python的标准数据类型string、int,也可使用Flask-RESTful提供的检验方法,还可以自己定义。
标准类型
rq.add_argument('b', type=str, required=True, action='append', location='args')
Flask-RESTful提供
检验类型方法在 flask_restful.inputs
模块中
- url
regex(指定正则表达式)
- natural 自然数0、1、2、3…
- positive 正整数 1、2、3…
int_range(low ,high)
整数范围- boolean 布尔类型
6、location
描述参数应该在请求数据中出现的位置
# Look only in the POST body 表单 parser.add_argument('name', type=int, location='form') # Look only in the querystring 请求地址?后面的参数 parser.add_argument('PageSize', type=int, location='args') # From the request headers 请求头 parser.add_argument('User-Agent', location='headers') # From http cookies parser.add_argument('session_id', location='cookies') # From json parser.add_argument('user_id', location='json') # From file uploads 文件提交 parser.add_argument('picture', location='files')
也可指明多个位置,中括号 [ ]
parser.add_argument('text', location=['headers', 'json'])
# -*- coding: utf-8 -*- from flask import Flask from flask_restful import Api, Resource, reqparse, inputs app = Flask(__name__) # 需求,对外提供一个API接口,可以访问某个资源 # 步骤一:创建restful的API api = Api(app) # 步骤二,定义资源resource class HelloResource(Resource): # 定义各种操作(函数) def get(self): return {'get': 'get'} def put(self): return {'put': 'put'} def post(self): # 1.创建请求参数校验的对象requestParser rq = reqparse.RequestParser() # 2.定义参数的校验申明 rq.add_argument('a', type=int, required=True, help='参数a错误', location='args') # 如果定义help,那么所有的校验只有一种 rq.add_argument('b', type=str, required=True, action='append', location='args') rq.add_argument('c', type=str, choices=['男', '女'], action='append', location='args') rq.add_argument('d', type=inputs.regex('^\d{2}$'), location='args') # 只允许两位整数 rq.add_argument('e', type=inputs.int_range(1, 100), location='args') # 允许范围内 rq.add_argument('f', type=inputs.boolean) # 只允布尔类型 # 3.启动校验 req = rq.parse_args() # 4.校验完后得到参数的值 a = req.a b = req.b c = req.c d = req.d return {"a": a, 'b': b, 'c': c, 'd': d} # 步骤三:把资源加载到Api中才能对外发布 api.add_resource(HelloResource, '/hello') # app.run可以省略 if __name__ == '__main__': app.run(host='0.0.0.0', port=8888, debug=True)