栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

day05 Flask-RESTful请求响应与SQLAlchemy基础

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

day05 Flask-RESTful请求响应与SQLAlchemy基础

目录

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()

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/870712.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号