首页 » PHP教程 » PHP的curljsonparams技巧_10分钟带你用Python构建RESTful API 做事

PHP的curljsonparams技巧_10分钟带你用Python构建RESTful API 做事

访客 2024-12-11 0

扫一扫用手机浏览

文章目录 [+]

本篇将以 Python 开始先容搭建 RESTful API 的流程 ,利用的技能栈是:Flask + flask-restful + flasgger

2. 安装依赖利用 Python 编写 RESTful API 之前,我们须要先在虚拟环境内安装对应的依赖

详细包含:

PHP的curljsonparams技巧_10分钟带你用Python构建RESTful API 做事

Flask- 根本 Web 框架

PHP的curljsonparams技巧_10分钟带你用Python构建RESTful API 做事
(图片来自网络侵删)

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

3. Hello World

首先,我们利用 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 完全的流程了,项目中涉及的多表,只须要变动数据库的逻辑操作就可以了

标签:

相关文章

ajax拜访php办法技巧_PHPAJAX 与 PHP

AJAX PHP 实例下面的实例将演示当用户在输入框中键入字符时,网页如何与 Web 做事器进行通信:实例考试测验在输入框中输入一...

PHP教程 2024-12-12 阅读0 评论0