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": "用户名或密码不能为空!!!"})
相关推荐
皮皮冰燃2 分钟前
关系数据库-10-[mysql5和mysql8]在windows中安装为服务并共存
windows·mysql
啊森要自信1 小时前
【MySQL 数据库】MySQL用户管理
android·c语言·开发语言·数据库·mysql
Liu1bo2 小时前
【MySQL】表的约束
linux·数据库·mysql
胖胖的战士2 小时前
Mysql 数据库迁移
数据库·mysql
星光一影2 小时前
大型酒店管理系统源码(多酒店版)
mysql·php
czhc11400756632 小时前
LINUX1012 mysql GLIBC安装
数据库·mysql
小草儿7992 小时前
gbase8s之.net8连接8s之mysql模式(windows)demo
windows·mysql·.net
sakoba3 小时前
MySQL的json处理相关方法
android·学习·mysql·json
程序新视界3 小时前
MySQL的整体架构及功能详解
数据库·后端·mysql
ANYOLY3 小时前
MySQL索引指南
数据库·mysql