五、Flask类视图和Restful

发布于:2024-04-27 ⋅ 阅读:(20) ⋅ 点赞:(0)

Restful

  • 安装pip install flask-restful
# exts.py
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_restful import Api

db = SQLAlchemy()
migrate = Migrate()
api = Api()


def init_exts(app):
    db.init_app(app=app)
    migrate.init_app(app=app, db=db)
    api.init_app(app=app) # 初始化
# apis.py
from flask import jsonify
from flask_restful import Resource, fields, marshal_with, reqparse
# 类视图: CBV   Class Based View
# 视图函数: FBV  Function Based View
class HelloResouce(Resource):
    # 如果url中定义了参数,请求方法也需要定义对应的参数
    # 如果add_resource中有url没有这个参数,就需要给这个参数设置一个默认值
    def get(self,msg='请求'): # get函数是Resource 类的,发送get请求会自动调用该函数
        return jsonify({'msg': msg})

    # restful接口默认返回的都是json数据
    def post(self,msg='请求'):
        return jsonify({'msg': msg})
# urls.py  路由文件

from .exts import api
from .apis import *

# 路由 第一个参数是类视图,第二个参数是路径
# # 可以在url中指定参数,就和“app.route”中定义参数一样,也需要在对应请求方法里也定义这个参数
# # add_resource定义url时,可以传入多个url,比如第二个url是没有传入参数的,这时候就需要在定义请求方法时将这个参数设置一个默认值,不然会报错
# # endpoint参数用于url_for函数反转,如果不指定endpoint参数,那么将使用视图类的名称的全小写作为endpoint
api.add_resource(HelloResouce, '/hello/','/hello/<msg>/')
# App包下的__init__.py
from flask import Flask
from .exts import init_exts
from .urls import *  # 导入进来否则urls的不会执行
def create_app():
    app = Flask(__name__)
    # 配置数据库
    db_uri = 'sqlite:///sqlite3.db'  # sqlite配置
    # db_uri = 'mysql+pymysql://root:123456@localhost:3306/flaskdb'  # mysql的配置
    app.config['SQLALCHEMY_DATABASE_URI'] = db_uri
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False  # 禁止对象追踪修改
    # 初始化插件
    init_exts(app=app)
    return app

字段格式化

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

# apis.py
from flask import jsonify
from flask_restful import Resource, fields, marshal_with, reqparse
from .models import *


# 类视图: CBV   Class Based View
# 视图函数: FBV  Function Based View
class HelloResouce(Resource):
    # 如果url中定义了参数,请求方法也需要定义对应的参数
    # 如果add_resource中有url没有这个参数,就需要给这个参数设置一个默认值
    def get(self,msg='请求'): # get函数是Resource 类的,发送get请求会自动调用该函数
        return jsonify({'msg': msg})

    # restful接口默认返回的都是json数据
    def post(self,msg='请求'):
        return jsonify({'msg': msg})

# --------------------------- 字段格式化 --------------------------- #

# Flask-RESTful
# 字段格式化:定义返回给前端的数据格式
ret_fields = {
    'status': fields.Integer,
    'msg': fields.String,
    # 'data': fields.String,
    'like': fields.String(default='ball'),
    'like2': fields.String(),
    'data2': fields.String(attribute='data')  # 使用data的值
}

class UserResource(Resource):
    @marshal_with(ret_fields)
    def get(self):
        return {
            'status': 1,
            'msg': 'ok',
            'data': '千锋教育Python'
        }


# --------------------------- 字段格式化 --------------------------- #

#
user_fields = {
    # 'id': fields.Integer,
    'name': fields.String,
    'age': fields.Integer,
    # 绝对路径
    'url': fields.Url(endpoint='id', absolute=True)

}
ret_fields2 = {
    'status': fields.Integer,
    'msg': fields.String,
    # user对象
    'data': fields.Nested(user_fields)
}

class User2Resource(Resource):
    @marshal_with(ret_fields2)
    def get(self):
        user = User.query.first()
        return {
            'status': 1,
            'msg': 'ok',
            'data': user
        }

# --------------------------- 字段格式化 --------------------------- #
user_fields2 = {
    'name': fields.String,
    'age': fields.Integer,
}
ret_fields3 = {
    'status': fields.Integer,
    'msg': fields.String,
    'data': fields.List(fields.Nested(user_fields2))
}

class User3Resource(Resource):
    @marshal_with(ret_fields3)
    def get(self):
        users = User.query.all()
        return {
            'status': 1,
            'msg': 'ok',
            'data': users
        }
# urls.py  路由文件

from .exts import api
from .apis import *

# 路由 第一个参数是类视图,第二个参数是路径
# # 可以在url中指定参数,就和“app.route”中定义参数一样,也需要在对应请求方法里也定义这个参数
# # add_resource定义url时,可以传入多个url,比如第二个url是没有传入参数的,这时候就需要在定义请求方法时将这个参数设置一个默认值,不然会报错
# # endpoint参数用于url_for函数反转,如果不指定endpoint参数,那么将使用视图类的名称的全小写作为endpoint
api.add_resource(HelloResouce, '/hello/','/hello/<msg>/')
# 第一个参数为视图类的名称,第二个参数是url字符串,并且可以有多个url,第三个参数是endpoint等关键字参数。
api.add_resource(UserResource, '/user/', endpoint='id')
api.add_resource(User2Resource, '/user2/')
api.add_resource(User3Resource, '/user3/')

参数解析

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到