本篇将以 Python 开始先容搭建 RESTful API 的流程 ,利用的技能栈是:Flask + flask-restful + flasgger
2. 安装依赖利用 Python 编写 RESTful API 之前,我们须要先在虚拟环境内安装对应的依赖
详细包含:
Flask- 根本 Web 框架

flask_restful- Flask 的扩展,增加了对快速构建 REST API 的支持
flasgger- flask 支持的 Swagger UI,可以天生 API 接口文档
# 安装flaskpip3 install flask# 安装flask-restfulpip3 install flask-restful# 安装flasgger# 把稳:须要更新setuptoolspip3 install -U setuptoolspip3 install flasgger# 管理数据库的依赖pip3 install flask_scriptpip3 install flask_migrate
首先,我们利用 Pycharm 创建一个 Flask Web 项目,初始化代码如下:
from flask import Flaskapp = Flask(__name__)@app.route('/')def hello_world:return 'Hello World!'if __name__ == '__main__':app.run
从 flask_restful 文件中导入 Api、Resource 两个类,利用上面的 app 工具,构建一个 api 工具,接着准备一个列表数据
from flask_restful import Api,Resourceapp = Flask(__name__)# 实例化一个 Api 工具,用来创建、管理 RESTful Apiapi = Api(app)# 准备一个列表数据datas = [{'id': 1, 'name': 'xag', 'age': 18}, {'id': 2, 'name': 'xingag', 'age': 19}]
然后,利用 Flask 中的 CBV 模式,创建一个 Resource 类的子类,用于定义资源路由
这里以 GET / POST 动作为例,重写 get、post 方法,并编写内部逻辑,返回数据即可
class UserView(Resource):\公众\"大众\公众通过继续 Resource 来实现调用 GET/POST 等动作方法\"大众\"大众\"大众def get(self):\"大众\"大众\"大众GET 要求:return:\"大众\公众\"大众return {'code': 200, 'msg': 'success', 'data': datas}def post(self):# 参数数据json_data = request.get_json# 追加数据到列表中new_id = len(datas)+1datas.append({'id':new_id,json_data})# 返回新增的末了一条数据return {'code': 200, 'msg': 'ok', 'success': datas[new_id - 1]}
末了,利用 Api 的实例工具,将上面定义的资源,利用路径,完备暴露出去
# 暴露接口出去# 资源路由:UserView# 路径:/userapi.add_resource(UserView,'/user')
运行程序后,就可以拿 Postman 或 cURL 去测试接口了
4. 项目实战
在实际项目开拓中,数据构造、层级关系每每要繁芜很多,我们须要对项目进行一次整合,按功能进行封装,详细步骤如下:
第 1 步,编写配置文件
新建一个配置文件 config.py,将数据库( 以 Mysql 为例 )的连接信息,包含:用户名、密码、端口号、数据库名、连接驱动和 Swagger 的设置信息追加进去
# config.pyUSERNAME = 'root'PASSWORD = 'root'HOSTNAME = \"大众127.0.0.1\"大众PORT = '3306'DATABASE = 'xag'DIALECT = 'mysql'DRIVER = 'pymysql'# 连接数据的URIDB_URI = \"大众{}+{}://{}:{}@{}:{}/{}?charset=utf8\公众.format(DIALECT, DRIVER, USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)SQLALCHEMY_DATABASE_URI = DB_URISQLALCHEMY_TRACK_MODIFICATIONS = TrueSWAGGER_TITLE = \公众API\公众SWAGGER_DESC = \"大众API接口\"大众# 地址,必须带上端口号SWAGGER_HOST = \"大众localhost:5000\"大众
第 2 步,模型映射数据库
创建一个模型类 Foo 继续 SQLAlchemy 工具,利用 __tablename__ 指定天生数据表的名称、然后新增几个常用字段
# models.pyfrom exts import dbclass Foo(db.Model):\"大众\"大众\"大众模型,将映射到数据库表中\"大众\公众\"大众__tablename__ = 'foo'# 主键IDid = db.Column(db.INTEGER, primary_key=True, autoincrement=True)# 名字name = db.Column(db.String(100), able=False)# 年事age = db.Column(db.INTEGER)
接着,创建 manage.py 文件
显式导入上面创建的 Foo 类,利用 flask_migrate 中的 Migrate 绑定 App 和数据库,利用 flask_script 中的 Manager 实例去添加一个脚本命令
# manager.pyfrom flask_migrate import Migrate, MigrateCommandfrom flask_script import Managerfrom exts import dbfrom api_app import appfrom models import Foomanager = Manager(app)migrate=Migrate(app, db)manager.add_command('db', MigrateCommand)if __name__ == '__main__':manager.run
须要把稳的是,Foo 模型必须显式导入,否则没法映射到数据库中
末了,通过下面 3 个脚本命令,将模型映射到数据库中
除了第一次须要天生迁移脚本外,后面映射数据库,只须要实行后面两个命令即可
# 初始化迁移文件python3 manager.py db init# 映射到文件python3 manager.py db migrate# 映射到数据库python3 manager.py db upgrade
打开 Navicat For Mysql,即可以看到刚刚映射过来的数据表及迁移表
第 3 步,创建资源路由
下面以创建列表查询( GET )、单条记录的查询( GET )、更新( PUT )、新增( POST )、删除( DELETE )为例
flask_restful 中的 marshal_with 类可以作为装饰器,定义到动作函数上,指定要返回的字段;然后利用 SQLAlchemy ORM 操作数据库,将数据直接进行返回
比如:返回获取数据列表
# api_foo.pyfrom flask_restful import Resource, fields, marshal_with, requestclass FooListApi(Resource):# 定义要返回的字段resource_fields = {'id': fields.Integer,'name': fields.String,'age': fields.String}# 装饰器,定义返回数据@marshal_with(resource_fields)def get(self):\"大众\"大众\"大众返回所有记录:return:\"大众\公众\"大众# 查询数据库foos = db.session.query(Foo).allreturn foos
对付新增一个工具( POST 动作)
# api_foo.pyclass FooApi(Resource):def post(self):\"大众\"大众\公众创建一条记录:return:\"大众\"大众\公众# 参数params = request.get_jsonname = params.get(\"大众name\"大众)age = params.get(\"大众age\"大众)# 构建一个模型foo = Foo(name=name, age=age)# 加入到数据库db.session.add(foo)db.session.commitreturn success(\"大众新增一条记录成功!
\"大众)
第 4 步,返回数据统一化
为了担保返回的数据构造同等,可以将返回码、返复书息及数据进行一次封装,通过jsonify进行格式化返回
# restful_utils.pyfrom flask import jsonifyclass HttpCode(object):ok = 200un_auth_error = 401params_error = 400server_error = 500def restful_result(code, message, data):return jsonify({\"大众code\"大众: code, \"大众message\"大众: message, \"大众data\"大众: data or {}})def success(message=\"大众\公众, data=None):\"大众\"大众\"大众精确返回:return:\"大众\"大众\公众return restful_result(code=HttpCode.ok, message=message, data=data)
第 5 步,暴露接口
利用 flask_restful 中的 Api 实例工具,将上面定义的资源路由暴露出去
#api_app.pyfrom flask_restful import Apiapi = Api(app)# 某一条记录api.add_resource(FooApi, '/api/v1/foo','/api/v1/foo/<int:id>')# 所有记录api.add_resource(FooListApi, '/api/v1/foos')
第 6 步,自动天生接口文档
Flask 中同样可以利用 Swagger 自动天生接口帮助文档
首先,从配置文件 config.py 中读取配置,实例化 Swagger 工具
#api_app.pyfrom flasgger import Swagger# API可视化管理swagger_config = Swagger.DEFAULT_CONFIG# 标题swagger_config['title'] = config.SWAGGER_TITLE# 描述信息swagger_config['description'] = config.SWAGGER_DESC# Hostswagger_config['host'] = config.SWAGGER_HOST# 实例化swagger = Swagger(app,config=swagger_config)
然后,在资源路由的动作内新增 swagger 注释内容,包含:要求办法、参数、相应数据、描述信息等
详细可以参考:http://editor.swagger.io/#/
以获取某一条数据为例:
class FooApi(Resource):resource_fields = {'id': fields.Integer,'name': fields.String,'age': fields.String}@marshal_with(resource_fields)def get(self, id):\"大众\公众\公众获取用户信息---schemes:- httpparameters:- name: idin: pathtype: integerrequired: truedefault: 1description: 用户idresponses:200:description: 返回用户信息examples:{\"大众id\公众: 1,\"大众name\公众: \"大众xag\"大众,\公众age\"大众:\公众18\公众}\"大众\"大众\"大众foo = db.session.query(Foo).get(id)return foo
末了,运行项目,访问下面的链接,即可以看到定义好的 RESTful API 做事了
http://localhost:5000/apidocs/#/
5. 末了
上面便是通过 Flask + flask_restful 单表实现 RESTful API 完全的流程了,项目中涉及的多表,只须要变动数据库的逻辑操作就可以了