什么是钩子(中间件Middleware)
钩子或叫钩子函数,是指在执行函数和目标函数之间挂载的函数,框架开发者给调用方提供一个point-挂载点,
是一种AOP切面编程思想,
常用的钩子函数
before_first_request: 处理第一次请求之前执行,
before_request: 在每次请求之前执行,通常使用这个钩子函数预处理一些变量,实现反爬等
after_request: 注册一个函数,如果没有未处理的异常抛出,在每次请求之后运行。
teardown_appcontext: 当APP上下文被移除之后执行的函数,可以进行数据库的提交或者回滚
g
global全局对象
g对象是专门用来保存用户的数据的
g对象在一次请求中的所有的代码的地方,都是可以使用的
突破变量存储位置限制,为数据传递添加了新的方式,比如我们在before_request产生一个数据在后面需要使用,
可以保存在g对象中,在其他视图函数中就可以使用这个数据,
request:
请求对象,可以获取客户端提交过来的所有请求信息
session:
会话技术,服务端会话技术的接口
current_app:
app的配置信息,app对象获取,
current app
使用获取当前app需要注意,一定要在程序初始化完成之后
Flask类视图 和 RESTfu
安装插件
# pip 安装 pip install flask-restful
创建Resource实现类 创建一个文件api
class HelloRESTful(Resource): def get(self): return {"data":"Hello GET"} def post(self): return {'data':'hello PosT'}
创建一个文件urls
#方式一: 创建并初始化 api = API(app) #方式二: 创建,之后初始化 api = API() api.init_app(app)
#注册路由 api.add resource(HellORESTFul,"/")
字段格式化
fields 进行定义
marshal_with 进行使用
特性
- 显示我们设计的数据结构
- 默认返回的数据如果在预定义结构中不存在,数据会被自动过滤
- 如果返回的数据在预定义的结构中存在,数据会正常返回
- 如果返回的数据比预定义结构中的字段少,预定义的字段会呈现一个默认值
定义字段输出
- 使用字典进行定义
- 常用都是基本类型:string,Integer
定义好的格式通过装饰器进行使用
@marshal_with(需要返回的数据格式),
return返回字典就ok了
class Users(Resource): @marshal with(user fields) def get(self): return {'msg':'呵呵','data':'没有数据', 'age':'22','private_data':'表中数据"}
案例展示 Nested 嵌套字典
#格式化字段 usermodel_fileds ={ 'id':fields.Integer, 'name': fields.string,
}
user2_fields ={ 'msg':fields.string(default='ok'), 'status':fields.Integer(default=1), 'data':fields.Nested(usermodel_fileds) // 这个字段要遵循上一个字段的定义
}
嵌套列表 fields.List (usermodel_fileds) 嵌套列表
#格式化字段 usermodel_fileds ={ 'id': fields.Integer, 'name': fields.string,
} users3_fields ={ 'status':fields.string(default=1), 'msg': fields.string, 'data': fields.List(fields.Nested(usermodel_fileds)
)
url
连接字段
- 就是将当前数据的操作api暴露出来
- 根据提供的ur1和唯一标识进行数据操作
#格式化字段 usermodel_fileds = { 'id':fields.Integer, 'name': fields.string, 'url':fields.Url('id', absolute=True)
}
# 在add_resource中提供对应的 endpoint api.add resource(Users4, "/user4/', endpoint='id')
接受前台提交的参数
参数解析 reqparse apis 文件代码
parser =reqparse.RequestParser( parser.add_argument('name',type=str,required=True, help='name是必需的参数') class User4Resource(Resource): def get(self): #获取参数 args =parser.parse args() name = args.get('name') return {'name': name}
标签:name,Flask,fields,app,中间件,视图,api,函数,string From: https://www.cnblogs.com/longly1111/p/18519749