欢迎,来自IP地址为:18.97.9.173 的朋友
REST 就是通过使用HTTP协议和URL,利用客户机/服务器模式对资源进行 CRUD(创建、读取、更新和删除)的操作。本文,我们将使用 Flask 和 MySQL 创建一个简单的具有 REST 风格接口的 Web 应用,并通过它来实现对后台数据库的 CRUD 操作。
Flask 是一款 Python 语言 Web 框架,它提供了灵活应对多种数据源的接口,以便同各种数据库进行交互。Flask 具有同 SQL 和 NoSQL 数据交互的能力。
使用 SQLAlchemy 创建 Flask 应用
Flask-SQLAlchemy 是一个 Flask 扩展,用以向应用提供 SQLAlchemy功能。SQLAlchemy 是一个 Python 组件,用于连接数据库完成对象关系映射。SQLAlchemy 可以提供企业级的稳定高效数据库访问能力。
SQLAlchemy 支持以下 SQL 数据库,当然对应的数据库驱动 API 需要安装:
- PostgreSQL
- MySQL
- Oracle
- SQLite
- Microsoft SQL Server
- Firebird Sybase
示例程序将采用 MySQL 数据库,并且使用 SQLAlchemy 扩展来进行数据库访问。
创建运行环境
首先,使用如下命令安装 Python 所需要模块:
pip install flask flask-sqlalchemy marshmallow_sqlalchemy pip install pymysql
之后,使用如下语句创建一个名为”Product”的数据库供 Web 应用程序使用:
MySQL[(none)]>create database Product;
创建 RESTful 应用程序
首先,创建一个 Python 文件”RESTful.py”,将如下内容添加到文件中,用于引入对应模块:
from flask import Flask, request, jsonify, make_response from flask_sqlalchemy import SQLAlchemy from marshmallow_sqlalchemy import ModelSchema from marshmallow import fields
应用程序中本部分是引入需要使用的模块:引入 Flask 的目的是创建一个 Web 应用实例;引入 request 的目的是接收客户端请求数据;引入 jsonify 的目的是将 JOSN 格式输出为响应对象格式;引入 flask_sqlalchemy 中 SQLAlchemyr 目的是连接数据库;引入 ModelSchema 的目的是序列化对象。
之后,初始化程序对象:
app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI']='mysql+pymysql://<mysql_username>:<mysql_password>@<mysql_host>:<mysql_port>/<mysql_db>' db = SQLAlchemy(app)
注意将”<mysql_username>:<mysql_password>@<mysql_host>:<mysql_port>/<mysql_db>”修改为实际使用的内容,例如”root:root@localhost:3306/Product”。
程序会创建一个 Flask web 应用对象以及一个 SQLAlchemy 数据库对象。
创建数据库
现在,我们将创建一个可以提供 RESTful CRUD API 的数据库,示例起见,数据库对象名为”Product”,所有的产品信息均存储在一个名为”products”的数据表中。
声明DB数据对象后,使用如下代码创建一个”Product”对象,该对象拥有一个数据表”products”:
###Models#### class Product(db.Model): __tablename__ = "products" id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(20)) productDescription = db.Column(db.String(100)) productBrand = db.Column(db.String(20)) price = db.Column(db.Integer) def create(self): db.session.add(self) db.session.commit() return self def __init__(self,title,productDescription,productBrand,price): self.title = title self.productDescription = productDescription self.productBrand = productBrand self.price = price def __repr__(self): return '' % self.id db.create_all()
现在,我们通过DB对象创建了一个名为”Product”的对象,该对象拥有5个字段,其中 id 为数据表的主键。最后调用db.create_all() 方法创建所有数据对象。
使用以下代码,将建立变量到字段的映射,这有助于我们将从 SQLAlchemy 获取的数据迅速转换为 JOSN 数据。
class ProductSchema(ModelSchema): class Meta(ModelSchema.Meta): model = Product sqla_session = db.session id = fields.Number(dump_only=True) title = fields.String(required=True) productDescription = fields.String(required=True) productBrand = fields.String(required=True) price = fields.Number(required=True)
构建终端 CRUD 路由
查询(Read)
创建完数据对象和返回函数后,我们转而构建终端 CRUD 路由函数。
@app.route('/products', methods = ['GET']) def index(): get_products = Product.query.all() product_schema = ProductSchema(many=True) products = product_schema.dump(get_products) return make_response(jsonify({"product": products}))
当终端访问”/products”虚拟目录时,通过 GET 方法,就可以得到数据库的全部产品信息,数据输入格式采用 JSON 方式。为了更好的理解,我们首先使用如下语句向”products”数据表中添加两条记录:
insert into products values -> (1,'Daehub TV','Daehub smart OLED TV 2019-01','DAEHUB',2019), -> (2,'Daehub Phone','Daehub smart mobile Phone 2019-02','DAEHUB',1111);
如果现在运行程序,并通过浏览器访问”http://127.0.0.1:5000/products”,就可以得到如下查询结果:
增加(Create)
同样,再添加一个使用 POST 方法的路由,用于向数据库中增加记录:
@app.route('/products', methods = ['POST']) def create_product(): data = request.get_json() product_schema = ProductSchema() product = product_schema.load(data) result = product_schema.dump(product.create()) return make_response(jsonify({"product": result}),200)
使用浏览器的REST客户端插件,就可以轻松实现发送 POST 请求的功能。由于程序解析的结果是 JSON 格式,所以请求的正文数据采用 JSON 格式,而请求的头中需要使用”Content-Type: application/json”指定。完整的 “crul”命令如下,可以帮助理解:
curl http://127.0.0.1:5000/products \ -H 'Content-Type: application/json' \ -d '{ "price": 9012, "productBrand": "DAEHUB", "productDescription": "Daehub super personal computer 2019-03", "title": "Daehub PC" }'
请求发送后,会得到如下结果:
更新(Update)
更新操作使用”PUT”方法,程序段中增加如下程序用于响应”PUT”请求:
@app.route('/products/<id>', methods = ['PUT']) def update_product_by_id(id): data = request.get_json() get_product = Product.query.get(id) if data.get('title'): get_product.title = data['title'] if data.get('productDescription'): get_product.productDescription = data['productDescription'] if data.get('productBrand'): get_product.productBrand = data['productBrand'] if data.get('price'): get_product.price = data['price'] db.session.add(get_product) db.session.commit() product_schema = ProductSchema(only=['id', 'title', 'productDescription','productBrand','price']) product = product_schema.dump(get_product) return make_response(jsonify({"product": product}))
我们首先查看一下所有产品的信息:
现在,想要把”id”为2的产品价格修改为2222,则同样使用浏览器插件发送”PUT”请求:
此时,产品信息就修改成功了。
删除(Delete)
删除数据库的记录,可以使用”Delete”请求,添加如下代码,就可以根据请求的”id”来删除对应产品了:
@app.route('/products/<id>', methods = ['DELETE']) def delete_product_by_id(id): get_product = Product.query.get(id) db.session.delete(get_product) db.session.commit() return make_response("",204)
运行程序后,我们通过浏览器删除”id”为3的产品:
再次查询产品信息时,就会发现”id”为3的产品已经被删除了:
以上就是通过 Flask-MySQL 实现的一个简单 RESTful CRUD 程序示例,程序通过 SQLAlchemy 实现对象数据映射,从而减化程序代码。
最后,希望对大家有所帮助。