使⽤Flask开发简单接⼝(3)--引⼊MySQL
前⾔
前⾯的两篇⽂章中,我们已经学习了通过Flask开发GET和POST请求接⼝,但⼀直没有实现操作数据库,那么我们今天的⽬的,就是学习如何将MySQL数据库运⽤到当前的接⼝项⽬中。
本⼈环境:Python 3.7.0 、MySQL 5.7
Flask操作MySQL的2种⽅式
⼀般情况,Flask操作MySQL⽐较常见的⽅式有2种:SQLAlchemy操作和 SQL操作。通过SQLAlchemy操作时,因为⼤多是通过数据库对象来操作,所以不需要写多少SQL语句,但为了顺便巩固⼀下SQL知识,在本⽂章中,我们将采⽤SQL操作来进⾏学习。
⽬前⽹上的相关⽂章中,⼤多数介绍的都是SQLAlchemy操作,SQLAlchemy操作相对也更简单好⽤⼀些,因为SQLAlchemy为Python与SQL之间建⽴了映射,如果使⽤它可以极⼤减少SQL语句的编写。
在使⽤SQL操作⽅式时,我们需要知道如何利⽤Python操作MySQL数据库,如果不太清楚的话,可以参考我之前的⼀篇⽂章:
数据库设计
我们创建⼀个数据库,命名为 flask_demo ,然后新建⼀个数据表 user ,建表语句如下:
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表中各字段对应含义如下:
id:⽤户id号,⾃增长
username:⽤户名
password:密码
role:⽤户⾓⾊,0表⽰管理员⽤户,1表⽰普通⽤户
sex:性别,0表⽰男性,1表⽰⼥性,允许为空
telephone:⼿机号
address:联系地址,允许为空
user表创建完成后,通过 DESC user 来查看下表结构。
mysql> DESC user;
+-----------+--------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| id        | int(11)      | NO  | PRI | NULL    | auto_increment |
| username  | varchar(20)  | NO  |    | NULL    |                |
| password  | varchar(255) | NO  |    | NULL    |                |
| role      | tinyint(1)  | NO  |    | NULL    |                |
| sex      | tinyint(1)  | YES  |    | NULL    |                |
| telephone | varchar(255) | NO  | UNI | NULL    |                |
| address  | varchar(255) | YES  |    | NULL    |                |
+-----------+--------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)
新增配置⽂件
我们在项⽬根路径下新建⼀个包 config ,在该包下存放配置⽂件 setting.py ,该⽂件⽤于配置 MySQL 的服务器地址、端⼝、⽤户名及密码、数据库名等参数。
# 服务端⼝配置
SERVER_PORT = 9999
# MySQL配置
MYSQL_HOST = "192.168.89.128"
MYSQL_PORT = 3306
MYSQL_USER = "root"
MYSQL_PASSWD = "123456"
MYSQL_DB = "flask_demo"
Python操作MySQL
我们在项⽬根路径下新建⼀个包 common ,在该包下新建⽂件 mysql_operate.py ,该⽂件下封装了Python操作MySQL的代码,后续将通过调⽤该⽂件的 db 对象及⽅法来操作数据库。
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):
# 建⽴数据库连接
< = t(
host=host,
port=port,
user=user,
passwd=passwd,
db=db
)
# 通过 cursor() 创建游标对象,并让查询结果以字典格式输出
self.cur = ursor(cursor=pymysql.cursors.DictCursor)
def __del__(self): # 对象资源被释放时触发,在对象即将被删除时的最后操作
# 关闭游标
self.cur.close()
# 关闭数据库连接
def select_db(self, sql):
"""查询"""
# 检查连接是否断开,如果断开就进⾏重连
# 使⽤ execute() 执⾏sql
ute(sql)
# 使⽤ fetchall() 获取查询结果
data = self.cur.fetchall()
return data
def execute_db(self, sql):
"""更新/新增/删除"""
try:
# 检查连接是否断开,如果断开就进⾏重连
手机mysql安装配置教程# 使⽤ execute() 执⾏sql
ute(sql)
# 提交事务
except Exception as e:
print("操作出现错误:{}".format(e))
# 回滚所有更改
db = MysqlDb(MYSQL_HOST, MYSQL_PORT, MYSQL_USER, MYSQL_PASSWD, MYSQL_DB)
完善GET和POST请求接⼝
获取所有⽤户信息(GET接⼝)
@ute("/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接⼝)
@ute("/users/<string:username>", methods=["GET"])
def get_user(username):
"""获取某个⽤户信息"""
sql = "SELECT * FROM user WHERE username = '{}'".format(username)
data = db.select_db(sql)
print("获取 {} ⽤户信息 == >> {}".format(username, data))
if data:computed和watch的区别
return jsonify({"code": "0", "data": data, "msg": "查询成功"})
return jsonify({"code": "1004", "msg": "查不到相关⽤户的信息"})
⽤户注册接⼝(POST接⼝)
@ute("/register", methods=['POST'])
def user_register():
"""⽤户注册"""
username = ("username").strip()  # ⽤户名
password = ("password").strip()  # 密码
sex = ("sex", "0").strip()  # 性别,默认为0(男性)
telephone = ("telephone", "").strip()  # ⼿机号,默认为空串
address = ("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)
print("新增⽤户信息 ==>> {}".format(sql3))
return jsonify({"code": 0, "msg": "恭喜,注册成功!"})
else:
return jsonify({"code": 2001, "msg": "⽤户名/密码/⼿机号不能为空,请检查"})
在这⾥,我们实现⽤户注册的时候,设置只能注册 role 字段值为 1 的普通⽤户,不允许直接注册管理员⽤户。相关的接⼝返回码和请求场景如下:
接⼝返回码请求场景
0请求参数正确,注册成功
2001请求参数中,⽤户名/密码/⼿机号,任⼀参数为空
2002请求参数中,⽤户名已被其他⼈注册使⽤
2003请求参数中, sex 性别字段值不是 0 或 1
2004请求参数中,⼿机号格式不正确
2005请求参数中,⼿机号已被其他⼈注册使⽤
可参考如下进⾏⽤户注册接⼝请求:
请求⽅式:POST什么叫递归函数
请求地址:127.0.0.1:5000/register
请求头:
Content-Type: application/json
Body:{"username": "wintest5", "password": "123456", "sex": "1", "telephone":"135********", "address": "上海市黄浦区"}
⽤户登录接⼝(POST接⼝)
@ute("/login", methods=['POST'])
def user_login():
"""⽤户登录"""
username = ("username").strip()
password = ("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": "⽤户名或密码错误"})
phpcms伪静态else:
return jsonify({"code": 1001, "msg": "⽤户名或密码不能为空"})
相关的接⼝返回码和请求场景如下:
接⼝返回码请求场景
0⽤户名和密码正确,登录成功1001
请求参数中,⽤户名或密码为空1002
请求参数中,⽤户名正确,密码错误1003请求参数中,使⽤了未注册的⽤户名
接⼝返回码请求场景
可参考如下进⾏⽤户登录接⼝请求:
将项⽬在服务器部署
app.run() 启动应⽤时配置参数
在Flask 中,我们通过 app.run() 启动应⽤时,可以配置⼀些参数,⽐如可以配置如下:
上⾯代码中,host 需设置为 0.0.0.0,这样才能在外⽹进⾏访问,⽐如我们在Linux 下部署项⽬,如果想在Windows 中进⾏请求访问,那么就需要设置为 0.0.0.0。
将项⽬根路径加⼊环境变量
我们把项⽬根路径下的 app.py 当做该项⽬的应⽤启动⼊⼝⽂件,那么就需要将项⽬的根路径临时加⼊到环境变量中,否则启动应⽤时可能会提⽰不到相关模块,具体配置如下:
命令⾏启动应⽤
我们这个项⽬的启动,只需要⼀⾏命令就可以搞定,以Linux
下后台运⾏⽅式启动为例,命令如下:
OK ,通过以上内容,我们已经成功将MySQL 引⼊到我们的接⼝项⽬中,并可以成功进⾏接⼝请求,相关代码已上传到GitHub ,⼤家有兴趣的可以基于此进⾏简单部署及开展接⼝测试。请求⽅式:POST
请求地址:127.0.0.1:5000/loginconstruction in progress
请求头:
Content-Type: application/x-www-form-urlencoded
Body :username=wintest&password=123456
from config.setting import SERVER_PORT
if __name__ == '__main__':
# host 为主机ip 地址,port 指定访问端⼝号,debug=True 设置调试模式打开
app.run(host="0.0.0.0", port=SERVER_PORT, debug=True)
excel mid函数import os, sys
from config.setting import SERVER_PORT
from api.user import app
# 项⽬根路径
BASE_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, BASE_PATH)  # 将项⽬根路径临时加⼊环境变量,程序退出后失效
if __name__ == '__main__':
# host 为主机ip 地址,port 指定访问端⼝号,debug=True 设置调试模式打开
app.run(host="0.0.0.0", port=SERVER_PORT, debug=True)
# /root/flaskDemo/app.py 表⽰项⽬根路径下的app.py 启动⼊⼝⽂件路径
# /root/flaskDemo/flaskDemo.log 表⽰输出的⽇志⽂件路径
nohup python3 /root/flaskDemo/app.py >/root/flaskDemo/flaskDemo.log 2>&1 &

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。