天天看点

Flask 框架 API 规范 & Flask 项目Restful API 规范Flask 框架结合 Restful 大模块

Flask 框架 API 规范 & Flask 项目Restful API 规范Flask 框架结合 Restful 大模块

Flask

  • Restful API 规范
  • Flask 框架结合 Restful 大模块

Restful API 规范

首先安装 flask_restful 模块,命令如下

pip install flask_restful
           

此处我们用 API 规范修饰了 Flask 对象,定义了类视图且在类视图里定义了 get 和post 方法,具体语法是,

reqparse.RequestParser()

用来实例化传输对象,

对象.add_argument()

用来添加参数,并且可以指定属性,

对象.parse_args()

用来获取所有参数

from flask import Flask  # 用于创建 Flask 实例
from flask_restful import Api, Resource, reqparse, inputs
# 用于绑定 Flask 对象, 继承父类, 实例化对象, 判断 url

web = Flask(__name__)
# 使用 Api 来绑定 web
api = Api(web)


class IndexView(Resource):
    def get(self):
        p = reqparse.RequestParser()
        p.add_argument('name', type=str, help='名字错误', required=True)  
        # required 参数的作用是只有修饰的变量接收到值时, 才能执行返回语句
        p.add_argument('password', type=str, help='密码错误', required=True)
        args = p.parse_args()
        print(args)
        return {'info': '登录成功'}

    def post(self):
        parse = reqparse.RequestParser()
        parse.add_argument('username', type=str, help='用户名错误', required=True)
        parse.add_argument('password', type=str, help='密码错误', required=True)
        parse.add_argument('age', type=int, help='年龄错误', required=True)
        parse.add_argument('gender', type=str, help='性别错误', choices=['man', 'woman'])
        parse.add_argument('url', type=inputs.url, help='url 错误')  # inputs.url 方法自动判断是否为 url
        args = parse.parse_args()  # 获取 parse 对象所有参数的键值
        print(args)
        return {'info': '登录成功'}


# 给视图函数类增添 url, 和起别名
api.add_resource(IndexView, '/', endpoint='index')


if __name__ == '__main__':
    web.run(debug=True, port=2000)  # 运行 Flask 实例
           

get 方法

不传递参数,先判断了 name,并且查询到了 name 并没有接收到,所有返回如下字符串

Flask 框架 API 规范 & Flask 项目Restful API 规范Flask 框架结合 Restful 大模块

传递参数 name,然后判断了 password,并且查询到了 password 并没有接收到,所有返回如下字符串

Flask 框架 API 规范 & Flask 项目Restful API 规范Flask 框架结合 Restful 大模块

传递参数 name,password,并且查询到都接收到了,所有返回如下字符串

Flask 框架 API 规范 & Flask 项目Restful API 规范Flask 框架结合 Restful 大模块

post 方法(postman 演示)

传递了所有参数

Flask 框架 API 规范 & Flask 项目Restful API 规范Flask 框架结合 Restful 大模块

传递第一个参数 username

Flask 框架 API 规范 & Flask 项目Restful API 规范Flask 框架结合 Restful 大模块

Flask 框架结合 Restful 大模块

Python 文件(manage.py)

控制台操作此文件,具体操作为创建迁移仓库

python manage.py db init

会生成一个迁移文件夹 migrations,所有的迁移文件存放的位置,创建迁移脚本

python manage.py db migrate

,更新数据库

python manage.py db upgrade

(此时数据库中生成表格)

from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
# 以上为二个插件
from exts import db  # 导入 db 数据库
from flask_restful_demo import web  # 导入 web 实例

import models  # 导入模型


manage = Manager(web)

Migrate(web, db)

manage.add_command('db', MigrateCommand)


if __name__ == '__main__':
    manage.run()
           

Python 文件(config.py)

此处为配置文件,用于 web 对象和数据库的关联

HOSTNAME = '127.0.0.1'  # 地址
DATABASE = 'mysql_1'  # 数据库
PORT = 3306  # 端口
USERNAME = 'root'  # 用户名
PASSWORD = 'root'  # 密码
DB_URL = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)  # 创建 url

SQLALCHEMY_DATABASE_URI = DB_URL
SQLALCHEMY_TRACK_MODIFICATIONS = False
           

Python 文件(exts.py)

此处为 sqlalchemy 插件插件数据库

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()
           

Python 文件(flask_restful_demo.py)

此文件用浏览器执行,从数据库中取得数据

from flask import Flask  # 用于实例化 Flask 对象
from flask_restful import Api, Resource, fields, marshal_with
# 用于绑定 Flask 对象, 继承父类, 实例化对象, 判断 url

import config
from exts import db
from models import Article

web = Flask(__name__)  # 实例化 Flask 对象
web.config.from_object(config)  # 绑定配置文件
db.init_app(web)  # 绑定 app
api = Api(web)  # 使用 Api 来绑定 app


class IndexView(Resource):

    resource_fields = {
        'article_title': fields.String(attribute='title'),
        'content': fields.String(attribute='content'),
        # 'author': fields.String, 访问的是另一个表格的数据, 使用方法 fields.Nested
        'author': fields.Nested({
            'username': fields.String(attribute='username'),
            'email': fields.String(attribute='email'),
        })
    }

    @marshal_with(resource_fields)  # 装饰器装饰属性 resource_fields
    def get(self, article_id):
        article = Article.query.get(article_id)  # 查询 article 表的第一行数据
        return article

    def post(self):
        return {'info': '登录成功'}


api.add_resource(IndexView, '/article/<article_id>', endpoint='article')  # 参数传入 marshal_with 装饰器


if __name__ == '__main__':
    web.run(debug=True, port=7500)
           

数据库补充几行数据,如下

Flask 框架 API 规范 &amp; Flask 项目Restful API 规范Flask 框架结合 Restful 大模块
Flask 框架 API 规范 &amp; Flask 项目Restful API 规范Flask 框架结合 Restful 大模块

如当 url 为 /article/1 时,查询的是第一行数据

Flask 框架 API 规范 &amp; Flask 项目Restful API 规范Flask 框架结合 Restful 大模块

如当 url 为 /article/2 时,查询的是第二行数据

Flask 框架 API 规范 &amp; Flask 项目Restful API 规范Flask 框架结合 Restful 大模块

Python 文件(models.py)

此处为数据库提供表格

from exts import db
# 创建二个表格, table , article


class User(db.Model):
    __tablename__ = 'table'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(50))
    email = db.Column(db.String(50))


class Article(db.Model):
    __tablename__ = 'article'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(50))
    content = db.Column(db.String(50))
    uid = db.Column(db.Integer, db.ForeignKey('table.id'))
    author = db.relationship('User', backref='articles')