IP Address:3.95.131.208


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 实现对象数据映射,从而减化程序代码。

最后,希望对大家有所帮助。

发表评论

电子邮件地址不会被公开。 必填项已用*标注