欢迎,来自IP地址为:216.73.216.157 的朋友
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 实现对象数据映射,从而减化程序代码。
最后,希望对大家有所帮助。
