一、使用flask连接数据库,实现数据持久化
在python中pymysql库是操作数据库的,下面是关于pymysql的一段介绍(可不看):
pymysql是Python中用于连接和操作MySQL数据库的一个库。它是在Python的基础上封装了MySQL的连接、查询和管理等功能,通过pymysql可以方便地在Python程序中与MySQL数据库进行交互。使用pymysql可以实现数据库的增删改查操作,执行SQL语句,获取查询结果等。
二、通过实现登录验证token逻辑,练习pymysql库
该功能的实现,首先需要接收用户的请求--提取token参数--验证token
提取参数方法在之前的文章中提到------->Flask框架内容基础1
import hashlib
import pymysql
from flask import Flask, jsonify, send_file, request
app = Flask(__name__)
@app.route('/login', methods=['GET'])
def login():
"""
登录案例 :
普遍的登录逻辑
请求的url中需要携带token。
:return:
"""
# 1.判断token是否为空
token = request.args.get('token')
if not token:
return jsonify({'status': False, "error": "认证失败"})
# 2.token是否合法,连接mysql
res = fetch_one("select * from user where token=%s", [token, ])
if not res:
return jsonify({'status': False, "error": "认证失败"})
username = request.json.get('username')
if not username:
return jsonify({'status': False, "error": "参数错误"})
# 调用核心算法,生成sign签名
username_string = username + 'sad546469879445646'
obj = hashlib.md5(username_string.encode('utf-8'))
sign = obj.hexdigest()
return jsonify({'status': True, 'data': sign})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080, debug=True)
封装了查询操作方法,传入sql和参数,返回查询的内容。
def fetch_one(sql, params):
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123456', charset='utf-8',
db='reception_program')
cursor = conn.cursor()
cursor.execute(sql, params)
res = cursor.fetchone()
cursor.close()
conn.close()
return res
三、集成数据库mysql连接池
通过上述的描述,相信读者能够初步的了解到pymysql库的使用,那么思考一下这样会不会存在什么问题?
上述的过程性能比较低,由于每个需要和数据库交互的业务都会去连接一次mysql,性能损耗较大
下图为抽象的程序与数据库连接过程(自己画的)
如果存在数据库连接池,就减少了程序与数据库连接与断开的过程,程序只专注与交互。
在python中存在DButils库,他帮我们集成了数据库连接池。
安装方法:
pip install DButils
连接池代码
POOL = PooledDB(
creator=pymysql, # 使用连接数据库的模块
maxconnections=10, # 设置最大连接数,0和None表示不限制连接数
mincached=2, # 初始化时,连接池中至少创建的空闲的连接,0表示不连接
maxcached=5, # 连接池中最多空闲的连接,0和None不限制
blocking=True, # 连接池中如果没有可用链接是否阻塞等待 ,True 等待 False 不等待然后报错
setsession=[], # 开始会话前执行的命令列表,如["set datestyle to ...","set time zone ..."]
ping=0,
host='127.0.0.1', port=3306, user='root', password='123456', charset='utf-8',
db='reception_program'
)
def fetch_one(sql, params):
# conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123456', charset='utf-8',
# db='reception_program')
conn = POOL.connection()
cursor = conn.cursor()
cursor.execute(sql, params)
res = cursor.fetchone()
cursor.close()
conn.close() # 不是关闭连接,是将连接重新交还给连接池
return res
需要注意的是,使用连接池创建连接时,close不在是关闭连接,而是将连接交还给连接池。
该部分内容有许多实现。线程池等与之原理类似。