restful
| 属于一种快速构建api的一种工具,和django的还是不相同的 |
| |
| 安装 |
| pip install flask-restful |
| |
| 可以和django一样进行 定义 类视图的方式 |
| 但是falskrestful中可以直接返回字典格式,它自动转换为json格式给客户端 |
| |
| |
基本的使用
| from flask import Flask |
| from flask_restful import Resource, Api |
| |
| app = Flask(__name__) |
| api = Api(app) |
| |
| |
| |
| class HellWord(Resource): |
| def get(self): |
| return {'name': 'hello'} |
| |
| def post(self): |
| return {'age': '18'} |
| |
| |
| |
| |
| api.add_resource(HellWord, '/') |
| if __name__ == '__main__': |
| app.run() |
| |
| 127.0.0.1/ get {'name': 'hello'} |
| 127.0.0.1/psot {'age': '18'} |
| |
| |
| |
| api.add_resource(HellWord, '/',endpoint='HelloWorld') |
| 通过这个参数endpoint |
蓝图使用restful
| from flask import Flask, Blueprint |
| from flask_restful import Resource, Api |
| |
| app = Flask(__name__) |
| bp = Blueprint('bp', __name__) |
| |
| bp_api = Api(bp) |
| |
| |
| class HellWord(Resource): |
| def get(self): |
| return {'name': 'hello'} |
| |
| |
| |
| bp_api.add_resource(HellWord, '/bp/helloword') |
| |
| app.register_blueprint(bp) |
| if __name__ == '__main__': |
| app.run() |
restful视图使用装饰器
| 使用Resource 继承的 类视图的父类,中的method_decorators 属性进行使用 |
| |
| |
| 1.列表方式装饰器 |
| |
| |
| |
| |
| |
| from flask import Flask |
| from flask_restful import Resource, Api |
| |
| app = Flask(__name__) |
| |
| |
| def decorator1(func): |
| def wrapper(*args, **kwargs): |
| print('装饰器1') |
| return func(*args, **kwargs) |
| |
| return wrapper |
| |
| |
| def decorator2(func): |
| def wrapper(*args, **kwargs): |
| print('装饰器2') |
| return func(*args, **kwargs) |
| |
| return wrapper |
| |
| |
| class UserInfo(Resource): |
| method_decorators = [decorator1, decorator2] |
| ''' |
| 内部原理 |
| for i in method_decorators: |
| func = i(get) # 将当前的get请求的方法传入 |
| |
| 第一次遍历: |
| get1 = func1(get) # 装饰器 |
| 第二次遍历 |
| get2 = func2(get1) # 将上面的装饰器对象get1传入装饰器方法2中 |
| |
| 相当于: |
| @decorator2 最外层的装饰器 将下面的内容当成参数 |
| |
| @decorator1 |
| def func() |
| |
| 理解: |
| decorator2(decorator1(get)) # 将下面的东西全部传入 |
| ''' |
| def get(self): |
| return {'name': 'wkx'} |
| |
| def post(self): |
| return {'pwd': 123} |
| |
| |
| api = Api(app) |
| api.add_resource(UserInfo, '/') |
| if __name__ == '__main__': |
| app.run(debug=True) |
| |
| |
| |
| decorator2(decorator1(get)) |
| --> decorator2( decorator1(get) --> wrapper内部的函数名字 内部的func指的就是get函数) |
| -->decorator2 --> 返回wrapper 内部的函数名字 其中里面的func指定就是 |
| |
| |
| 当 get方法被调用的使用 |
| 执行 decorator2 --> 返回wrapper 方法 中的 func(是decorator1 中的wrapper) |
| 执行后 就会还行decorator1中的wrapper 内部的func(就是get方法) |
| |
| |
| 调用装饰器 :外部的方法执行 |
| 调用被装饰的函数 :才是装饰器内部的方法被执行 |
| |
| |
| |
| |
| from flask import Flask |
| from flask_restful import Resource, Api |
| |
| app = Flask(__name__) |
| |
| |
| def decorator1(func): |
| def wrapper(*args, **kwargs): |
| print('装饰器1') |
| return func(*args, **kwargs) |
| |
| return wrapper |
| |
| |
| def decorator2(func): |
| def wrapper(*args, **kwargs): |
| print('装饰器2') |
| return func(*args, **kwargs) |
| |
| return wrapper |
| |
| |
| class UserInfo(Resource): |
| method_decorators = { |
| 'get': [decorator1, decorator2], |
| 'post': [decorator2] |
| } |
| |
| def get(self): |
| return {'name': 'wkx'} |
| |
| def post(self): |
| return {'pwd': 123} |
| |
| |
| api = Api(app) |
| api.add_resource(UserInfo, '/') |
| if __name__ == '__main__': |
| app.run(debug=True) |
| |
获取请求参数
| 原生的是request对象获取请求。 |
| restful 提供了requestParset类 用来帮我们校验和转换请求数据的 |
| |
| from flask_restful.reqparse import RequestParser |
| |
| from flask import Flask |
| from flask_restful import Resource, Api |
| from flask_restful.reqparse import RequestParser |
| |
| app = Flask(__name__) |
| |
| |
| class UserInfo(Resource): |
| |
| def get(self): |
| |
| |
| rp = RequestParser() |
| |
| rp.add_argument('a') |
| rp.add_argument('b') |
| |
| res = rp.parse_args() |
| print(res) |
| |
| |
| return {'name': 'wkx'} |
| |
| |
| api = Api(app) |
| api.add_resource(UserInfo, '/') |
| if __name__ == '__main__': |
| app.run(debug=True) |
| |
| |
| |
| 参数说明 |
| 1.required |
| 参数默认为 False 可以不用传值 |
| rp.add_argument('a', required=True) 报错400 |
| |
| |
| |
| 2. help 参数,定制错误的提示 |
| rp.add_argument('a', required=True,help='参数必须传入') |
| |
| |
| 3.action 如果传入的参数同名的情况下 |
| 默认 action='store' 保留出现的第一个 |
| action = 'append' 一列表的形式追加保存同名参数的值 |
| |
| rp.add_argument('a', required=True,help='参数必须传入',action='append') |
| http://127.0.0.1:5000/?a=10&a=40&a=50 |
| {a:[10,40,50]} |
| |
| 4.type 类型的制定 |
| 1.自带 |
| str 会将全部的参数全部转换为字符串 |
| rp.add_argument('a', required=True,help='参数必须传入',type=str) |
| int 传入其他类型报错,如果可以转换,那么他会转换为int |
| rp.add_argument('a', required=True,help='参数必须传入',type=int) |
| |
| 在inputs模块中指定的其他类型 |
| from flask_restful import inputs |
| int_range :整数的返回最小1最大5 整数的返回 |
| rp.add_argument('a', required=True, help='参数必须传入',type=inputs.int_range(1, 5)) |
| |
| natural 自然数 0...10 |
| rp.add_argument('a', required=True, help='参数必须传入', |
| type=inputs.natural) |
| |
| positive 正整数 |
| rp.add_argument('a', required=True, help='参数必须传入', |
| type=inputs.positive) |
| |
| regex 传入正则表达式 |
| rp.add_argument('a', required=True, help='参数必须传入', |
| type=inputs.regex(r'\d')) |
| url 传入url |
| rp.add_argument('a', required=True, |
| type=inputs.url) |
| |
| |
| 自定义类型 |
| def mobile(mobile_str): |
| ''' |
| :param mobile_str: 接受被验证的参数(接受参数) |
| :return: 返回验证过的数据,如果错误就抛出异常 |
| ''' |
| |
| if re.match(r'^1[3-9]\d{9}$',mobile_str): |
| return mobile_str |
| else: |
| raise ValueError('{} 格式不正确'.format(mobile_str)) |
| |
| rp.add_argument('a', required=True,type=mobile) |
| |
| |
| 5.指明参数传递的位置 location |
| rp.add_argument('a', required=True, |
| type=int,location='form') |
| |
| json files cookies headers args form 等位置进行传参 |
| 可以指明多个属性 location = [json,files] |
使用序列化工具返回json格式
| 可以直接返回字典类型转为json格式给前端 |
| 把模型类转换字典,指定需要的内容。 |
| 工具:marshal |
| from flask_restful import marshal_with,marshal |
| |
| marshal_with : 以视图装饰器的形式进行返回数据,对原始的marshl进行封装 |
| marshal :直接返回数据 |
| |
| |
| from flask import Flask |
| from flask_restful import Resource, Api, marshal_with, fields(定义类型), marshal |
| |
| |
| app = Flask(__name__) |
| |
| resouecr_fields = { |
| 'name': fields.String, |
| 'age': fields.Integer, |
| 'address': fields.String |
| } |
| |
| |
| class UserInfo(Resource): |
| |
| |
| |
| |
| |
| def get(self): |
| |
| data = {'name': 'wkx', 'age': 123} |
| return marshal(data, resouecr_fields,envelope='data') |
| |
| |
| api = Api(app) |
| api.add_resource(UserInfo, '/') |
| if __name__ == '__main__': |
| app.run(debug=True) |
| |
| |
| |
| { |
| "data": { |
| "name": "wkx", |
| "age": 123, |
| "address": null |
| } |
| } |
定制返回的json数据
| from flask import make_response, current_app |
| from flask_restful.utils import PY3 |
| from json import dumps |
| |
| |
| |
| |
| @api.representations('application/json') |
| def handle_json(data, code, headers): |
| ''' |
| :param data: 接受视图的返回字典数据(需要返回前端) |
| :param code: 想返回的状态码 |
| :param headers: 返回的表头 |
| :return: 返回给前端的数据 |
| ''' |
| |
| if 'message' not in data: |
| data = { |
| 'message': 'OK', |
| 'data': data |
| } |
| |
| settings = current_app.config.get('RESTFUL_JSON', {}) |
| if current_app.debug: |
| settings.setdefault('indent', 4) |
| settings.setdefault('sort_keys', not PY3) |
| dumped = dumps(data, **settings) + "\n" |
| resp = make_response(dumped, code) |
| resp.headers.extend(headers or {}) |
| return resp |
| |
| |
| 调用原代码 进行原始的封装,该原来的原代码 |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步