目录
1.请求解析
1.1 RequestParser处理请求
1.2 参数详解
2. 响应
2.1 序列化数据:
2.2 定制返回的JSON格式
3.ORM与Flask-SQLAlchemy扩展
3.1 ORM介绍
3.2 Flask-SQLAlchemy扩展
3.3 表的基本创建
3.4 数据库迁移操作
4.单表数据增删改查操作
4.1 新增数据与事务
4.2 简单查询
4.3 更新数据
4.4 删除数据
1.请求解析
1.1 RequestParser处理请求
Flask-RESTful提供RequestParser类, 用来帮助我们检验和转换请求数据. 它设计成提供简单并且统一的访问Flask.request对象里的任何变量的入口
# 1.简单实例: 从请求中获取id参数
from flask import Flask
from flask_restful import Api, Resource
from flask_restful import reqparse
app = Flask(__name__)
api = Api(app)
class Index(Resource):
def get(self):
# 构建RequestParser()对象
parser = reqparse.RequestParser()
# 添加验证参数id
parser.add_argument('id')
# 启动检验处理
args = parser.parse_args()
# args['id']为获取id参数的值
return '参数ID的值为: {}'.format(args['id'])
api.add_resource(Index, '/index')
# 访问: /index?id=8, 则Index视图类的get方法的返回值则为: "参数ID的值为: 8"
if __name__ == '__main__':
app.run()
请求解析的使用步骤:
1.导入RequestParser类
2.实例化RequestParser对象
3.向RequestParser对象中添加需要检验或转换的参数声明
4.使用parse_args()方法启动检验处理
5.通过args.id或args['id']的方法获取参数
1.2 参数详解
parser.add_argument()方法参数详解
1.required: 描述请求是否一定要携带对应的参数, 默认值为False
- True: 强制要求携带, 若未携带,则校验失败,向客户端返回错误信息,状态码400
- False: 不强制要求携带, 若不强制携带,在客户端请求未携带参数时,取出值为None
2.help: 参数检验错误时返回的错误描述信息
3.action: 描述对于请求参数中出现多个同名参数时的处理方式
- action='store': 保留出现的第一个, 默认
- action='append': 以列表追加保存所有同名参数的值
4.type: 描述参数应该匹配的类型,可以使用python的标准数据类型string、int,也可使用Flask-RESTful提供的检验方法,还可以自己定义
(1). 标准类型:str或int
rp.add_argument('a', type=int, required=True, help='missing a param', action='append')
(2). url, regex, natural, positive, int_range(low,high), boolean
5.location: 描述参数应该在请求数据中出现的位置
# 请求体中
parser.add_argument('name', type=int, location='form')
# 查询参数中
parser.add_argument('PageSize', type=int, location='args')
# 请求头中
parser.add_argument('User-Agent', location='headers')
# cookie中
parser.add_argument('session_id', location='cookies')
# json数据中
parser.add_argument('user_id', location='json')
# 文件上传
parser.add_argument('picture', location='files')
# 指定多处
parser.add_argument('text', location=['headers', 'json'])
2. 响应
关于响应, 主要有两方面:
- 2.1序列化数据
- 1.序列化数据介绍
- 2.使用步骤
- 3.装饰器形式序列化数据
- 4.marshal()方法序列化数据
- 2.2定制返回JSON数据
- 1.实例
- 2.使用步骤
2.1 序列化数据:
1. 序列化数据:
Flask-RESTful 提供了marshal工具,用来帮助我们将数据序列化为特定格式的字典数据,以便作为视图的返回值。
2. 使用步骤
1.导入marshal_with装饰器, 或marshal方法
2.定义序列化类
3.装饰视图类方法或直接通过marshal方法序列化
3. 装饰器形式序列化数据
from flask import Flask
from flask_restful import Api, Resource
from flask_restful import fields, marshal_with
app = Flask(__name__)
api = Api(app)
# 定义模型类, 模拟数据操作
class User(object):
def __init__(self, name, age, password):
self.name = name
self.age = age
self.password = password
# 定义序列化字段
resource_fields = {
'name': fields.String,
'age': fields.Integer,
}
# 视图类
class Index(Resource):
# 装饰器实现徐泪花操作
# resource_fields: 指定序列化的字段
# envelope: 返回序列化数据的键名
@marshal_with(resource_fields, envelope='data')
def get(self, **kwargs):
user = User('Jeremy', 18, '123456')
return user
# 给视图指定路由
api.add_resource(Index, '/index')
if __name__ == '__main__':
app.run()
4. marshal方法直接序列化
from flask import Flask
from flask_restful import Api, Resource
from flask_restful import fields, marshal_with, marshal
app = Flask(__name__)
api = Api(app)
class User(object):
def __init__(self, name, age, password):
self.name = name
self.age = age
self.password = password
resource_fields = {
'name': fields.String,
'age': fields.Integer,
}
class Index(Resource):
def get(self, **kwargs):
user = User('Jeremy', 18, '123456')
# marshal()方法直接序列化数据
# user: 要序列化的数据
# resource_fields: 要序列化的字段
return marshal(user, resource_fields)
api.add_resource(Index, '/index')
if __name__ == '__main__':
app.run()
2.2 定制返回的JSON格式
1. 定制返回
想要接口返回的JSON数据具有统一的格式时,比如:
{
"msg": "successful",
"code": 250,
"data": {...}
}
在接口处理正常的情况下, msg返回successful字符串即可, 每个接口都重新定义一次可能有些麻烦, 能否在某处统一格式化为上面的结构呢? 这是我们要解决的问题
2. 定制返回JSON数据实现步骤
1.找到flask_restful.representations.json中的output_json函数
2.复制output_json函数并重写, 在内部定义数据格式
3.使用@api.representation('application/json')装饰器装饰重写的output_json函数
3. 示例
from flask import Flask
from flask_restful import Api, Resource
app = Flask(__name__)
api = Api(app)
from flask import make_response, current_app
from flask_restful.utils import PY3
from json import dumps
# 重写output_json函数
# 使用api.representation装饰器装饰
@api.representation('application/json')
def output_json(data, code, headers=None):
# 定制JSON格式
# 注意: 由于返回错误响应是, 已经在响应数据中包含message, 所以不必要再进行定制了, 所以进行了if判断
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
class Index(Resource):
def get(self, **kwargs):
user = {'name': 'jeremy', 'age': 18, 'gender': 1}
ret = 1/0
return user
api.add_resource(Index, '/index')
if __name__ == '__main__':
app.run()
3.ORM与Flask-SQLAlchemy扩展
1. ORM介绍
2. Flask-SQLAlchemy扩展使用
3. Flask-Migrate扩展使用
3.1 ORM介绍
ORM又称"对象关系映射", 即Object Relation Mapping. 那到底什么是"对象关系映射"
Django框架中:
模型类 <---> 表
属性 <---> 字段
对象 <---> 记录
ORM的优点与缺点
优点:
省去自己拼写SQL,保证SQL语法的正确性
一次编写可以适配多个数据库
防止注入攻击
在数据库表名或字段名发生变化时,只需修改模型类的映射,无需修改数据库操作的代码(相比SQL的话,可能需要同步修改涉及到的每一个SQL语句)
缺点:
执行效率低下
ORM框架
- SQLAlchemy
- Flask-SQLAlchemy
SQLAlchemy是python的包, Flask-SQLAlchemy是对SQLAlchemy的进一步封装, 以作为Flask框架的扩展适配Flask框架.
3.2 Flask-SQLAlchemy扩展
安装:pip install flask-sqlalchemy
连接数据库:
from flask import Flask
app = Flask(__name__)
class Config(object):
SQLALCHEMY_DATABASE_URI = 'mysql://root:admin123@127.0.0.1:3306/jiyunstus'
SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_ECHO = True
app.config.from_object(Config)
3.3 表的基本创建
1. 简单实例:
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
email = db.Column(db.String(120), unique=True)
def __str__(self):
return self.username
2. 定义规则
- (1).模型类继承与db.Model
- (2).字段对应为模型类的属性, db.Column()为指定字段, 第一个参数为数据类型.
- (3).表中必须设置主键, 主键用primary_key=True设置.
3. 数据类型如下表
| 数据类型 | 解释 |
|---|---|
| Integer | 一个整数(*) |
| String (size) | 有长度限制的字符串(*) |
| Text | 一些较长的 unicode 文本(*) |
| DateTime | 表示为 Python datetime 对象的 时间和日期(*) |
| Float | 存储浮点值 |
| Boolean | 存储布尔值 |
| PickleType | 存储为一个持久化的 Python 对象 |
| LargeBinary | 存储一个任意大的二进制数据 |
3.4 数据库迁移操作
数据库迁移操作可以使用db.create_all()将模型迁移至数据库中生成表, 但此种方法不能实现同步, 所以需要借助Flask-Migrate与Flask-Script扩展实现数据库的迁移
数据库的迁移:
- 1.安装Flask-SQLAlchemy, Flask-Migrate, Flask-Script等扩展(已完成)
- 2.配置数据库连接(已完成)
- 3.创建模型类(已完成)
- 4.创建迁移脚本
- 5.执行迁移命令
创建建议脚本
from flask_migrate import Migrate, MigrateCommand
from flask_script import Manager, Shell
from alchemy_test import app, db, Stu
manage = Manager(app)
migrate = Migrate(app, db)
manage.add_command('db', MigrateCommand)
if __name__ == '__main__':
manage.run()
执行迁移命令
python run.py db init
python run.py db migrate
python run.py db upgrade
4.单表数据增删改查操作
4.1 新增数据与事务
# 增加数据
use = User(id,username,password)
# 定义会话进行添加
db.session.add(use)
# 提交事务
db.session.commit()
# 注意: 增加数据, 修改数据及删除数据均需要提交事务
# 增加多条:
db.session.add_all([use1, use2, use3])
4.2 简单查询
# 简单查询
User.query.all()
User.query.get(1)
User.query.filter_by(username='name').first()
4.3 更新数据
# 修改数据
User.query.filter_by(username='name').update({'password':'newdata'})
# 注意: 增加数据, 修改数据及删除数据均需要提交事务
db.session.commit()
4.4 删除数据
# 删除数据
User.query.filter_by(username='name').delete()
# 注意: 增加数据, 修改数据及删除数据均需要提交事务
db.session.commit()
# 增加数据 use = User(id,username,password) # 定义会话进行添加 db.session.add(use) # 提交事务 db.session.commit() # 注意: 增加数据, 修改数据及删除数据均需要提交事务 # 增加多条: db.session.add_all([use1, use2, use3])
4.2 简单查询
# 简单查询
User.query.all()
User.query.get(1)
User.query.filter_by(username='name').first()
4.3 更新数据
# 修改数据
User.query.filter_by(username='name').update({'password':'newdata'})
# 注意: 增加数据, 修改数据及删除数据均需要提交事务
db.session.commit()
4.4 删除数据
# 删除数据
User.query.filter_by(username='name').delete()
# 注意: 增加数据, 修改数据及删除数据均需要提交事务
db.session.commit()
# 修改数据
User.query.filter_by(username='name').update({'password':'newdata'})
# 注意: 增加数据, 修改数据及删除数据均需要提交事务
db.session.commit()



