
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 并没有接收到,所有返回如下字符串
传递参数 name,然后判断了 password,并且查询到了 password 并没有接收到,所有返回如下字符串
传递参数 name,password,并且查询到都接收到了,所有返回如下字符串
post 方法(postman 演示)
传递了所有参数
传递第一个参数 username
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)
数据库补充几行数据,如下
如当 url 为 /article/1 时,查询的是第一行数据
如当 url 为 /article/2 时,查询的是第二行数据
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')