Flask接口开发--引入mysql

数据库设计

创建一个数据库flask_demo:

然后新建一个数据表 user ,建表语句如下:

c 复制代码
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(20) NOT NULL,
  `password` varchar(255) NOT NULL,
  `role` tinyint(1) NOT NULL,
  `sex` tinyint(1) DEFAULT NULL,
  `telephone` varchar(255) NOT NULL,
  `address` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `telephone` (`telephone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

user表中各字段对应含义如下:

c 复制代码
id:用户id号,自增长
username:用户名
password:密码
role:用户角色,0表示管理员用户,1表示普通用户
sex:性别,0表示男性,1表示女性,允许为空
telephone:手机号
address:联系地址,允许为空

新增配置文件

我们在项目根路径下新建一个包 config ,在该包下存放配置文件 setting.py ,该文件用于配置 MySQL 的服务器地址、端口、用户名及密码、数据库名等参数。

c 复制代码
# 服务端口配置
SERVER_PORT = 5000

# MySQL配置
MYSQL_HOST = "xxx.xxx.xxx.xx"
MYSQL_PORT = 3306
MYSQL_USER = "root"
MYSQL_PASSWD = "123456"
MYSQL_DB = "flask_demo"

Python操作MySQL

我们在项目根路径下新建一个包 common ,在该包下新建文件 mysql_operate.py ,该文件下封装了Python操作MySQL的代码,后续将通过调用该文件的 db 对象及方法来操作数据库。

c 复制代码
import pymysql
from config.setting import MYSQL_HOST,MYSQL_PORT,MYSQL_USER,MYSQL_PASSWD,MYSQL_DB

class MysqlDb():

    def __init__(self, host, port, user, passwd, db):
        # 建立数据库连接
        self.conn = pymysql.connect(
            host=host,
            port=port,
            user=user,
            passwd=passwd,
            db=db
        )
        # 通过 cursor() 创建游标对象,并让查询结果以字典格式输出
        self.cur = self.conn.cursor(cursor=pymysql.cursors.DictCursor)

    def __del__(self): # 对象资源被释放时触发,在对象即将被删除时的最后操作
        # 关闭游标
        self.cur.close()
        # 关闭数据库连接
        self.conn.close()

    def select_db(self, sql):
        """查询"""
        # 检查连接是否断开,如果断开就进行重连
        self.conn.ping(reconnect=True)
        # 使用 execute() 执行sql
        self.cur.execute(sql)
        # 使用 fetchall() 获取查询结果
        data = self.cur.fetchall()
        return data

    def execute_db(self, sql):
        """更新/新增/删除"""
        try:
            # 检查连接是否断开,如果断开就进行重连
            self.conn.ping(reconnect=True)
            # 使用 execute() 执行sql
            self.cur.execute(sql)
            # 提交事务
            self.conn.commit()
        except Exception as e:
            print("操作出现错误:{}".format(e))
            # 回滚所有更改
            self.conn.rollback()

db = MysqlDb(MYSQL_HOST, MYSQL_PORT, MYSQL_USER, MYSQL_PASSWD, MYSQL_DB)

完善GET和POST请求接口

获取所有用户信息(GET接口)

c 复制代码
@app.route("/users", methods=["GET"])
def get_all_users():
    """获取所有用户信息"""
    sql = "SELECT * FROM user"
    data = db.select_db(sql)
    print("获取所有用户信息 == >> {}".format(data))
    return jsonify({"code": "0", "data": data, "msg": "查询成功"})

获取某个用户信息(GET接口)

c 复制代码
@app.route("/users/<string:username>", methods=["GET"])
def get_user(username):
    """获取某个用户信息"""
    db.conn.ping(reconnect=True)
    db.conn.commit()  # 提交当前连接事务
    sql = "SELECT * FROM user WHERE username = '{}'".format(username)
    data = db.select_db(sql)
    print("获取 {} 用户信息 == >> {}".format(username, data))
    if data:
        return jsonify({"code": 0, "data": data, "msg": "查询成功"})
    return jsonify({"code": "1004", "msg": "查不到相关用户的信息"})

用户注册接口(POST接口)

c 复制代码
@app.route("/register", methods=['POST'])
def user_register():
    """用户注册"""
    username = request.json.get("username").strip()  # 用户名
    password = request.json.get("password").strip()  # 密码
    sex = request.json.get("sex", "0").strip()  # 性别,默认为0(男性)
    telephone = request.json.get("telephone", "").strip()  # 手机号,默认为空串
    address = request.json.get("address", "").strip()  # 地址,默认为空串
    if username and password and telephone:
        sql1 = "SELECT username FROM user WHERE username = '{}'".format(username)
        res1 = db.select_db(sql1)
        print("查询到用户名 ==>> {}".format(res1))
        sql2 = "SELECT telephone FROM user WHERE telephone = '{}'".format(telephone)
        res2 = db.select_db(sql2)
        print("查询到手机号 ==>> {}".format(res2))
        if res1:
            return jsonify({"code": 2002, "msg": "用户名已存在,注册失败!!!"})
        elif not (sex == "0" or sex == "1"):
            return jsonify({"code": 2003, "msg": "输入的性别只能是 0(男) 或 1(女)!!!"})
        elif not (len(telephone) == 11 and re.match("^1[3,5,7,8]\d{9}$", telephone)):
            return jsonify({"code": 2004, "msg": "手机号格式不正确!!!"})
        elif res2:
            return jsonify({"code": 2005, "msg": "手机号已被注册!!!"})
        else:
            sql3 = "INSERT INTO user(username, password, role, sex, telephone, address) " \
                  "VALUES('{}', '{}', '1', '{}', '{}', '{}')".format(username, password, sex, telephone, address)
            db.execute_db(sql3)
            print("新增用户信息 ==>> {}".format(sql3))
            return jsonify({"code": 0, "msg": "恭喜,注册成功!"})
    else:
        return jsonify({"code": 2001, "msg": "用户名/密码/手机号不能为空,请检查!!!"})

用户登录接口(POST接口)

c 复制代码
@app.route("/login", methods=['POST'])
def user_login():
    """用户登录"""
    username = request.values.get("username").strip()
    password = request.values.get("password").strip()
    if username and password:
        sql1 = "SELECT username FROM user WHERE username = '{}'".format(username)
        res1 = db.select_db(sql1)
        print("查询到用户名 ==>> {}".format(res1))
        if not res1:
            return jsonify({"code": 1003, "msg": "用户名不存在!!!"})
        sql2 = "SELECT * FROM user WHERE username = '{}' and password = '{}'".format(username, password)
        res2 = db.select_db(sql2)
        print("获取 {} 用户信息 == >> {}".format(username, res2))
        if res2:
            return jsonify({"code": 0, "msg": "恭喜,登录成功!"})
        return jsonify({"code": 1002, "msg": "用户名或密码错误!!!"})
    else:
        return jsonify({"code": 1001, "msg": "用户名或密码不能为空!!!"})
相关推荐
卡皮巴拉爱吃小蛋糕11 分钟前
MySQL的MVCC【学习笔记】
数据库·笔记·mysql
玄明Hanko20 分钟前
生产环境到底能用Docker部署MySQL吗?
后端·mysql·docker
清流君22 分钟前
【MySQL】数据库 Navicat 可视化工具与 MySQL 命令行基本操作
数据库·人工智能·笔记·mysql·ue5·数字孪生
邂逅岁月22 分钟前
MySQL表的增删改查初阶(下篇)
数据库·sql·mysql
逾非时2 小时前
MySQL触法器
android·mysql·sqlserver
聪明的墨菲特i2 小时前
SQL进阶知识:九、高级数据类型
xml·数据库·sql·mysql·json·空间数据类型
艺杯羹2 小时前
JDBC 批处理与事务处理:提升数据操作效率与一致性的密钥
数据库·mysql·jdbc·事务处理·批处理数据
珹洺3 小时前
Jsp技术入门指南【十】IDEA 开发环境下实现 MySQL 数据在 JSP 页面的可视化展示,实现前后端交互
java·运维·前端·mysql·intellij-idea·jsp
_extraordinary_6 小时前
MySQL 库的操作 -- 增删改查,备份和恢复,系统编码
android·mysql·oracle
mutianhao10246 小时前
SQLAlchemy 2.x 异步查询方法比较
python·mysql·sqlalchemy