系列文章目录
第三章 数据库连接池、wtfroms、信号、多app应用、flask-script、flask请求上下文分析
文章目录
一、数据库连接池
后端常常需要使用数据库的数据
当我们将数据库链接对象做成全局的就会产生,多个线程操作一个数据库链接对象时,容易导致数据错乱现象(例如一个线程使用该链接对象获取数据还未操作完毕,另一个线程使用该链接对象读取了其他数据,就产生了数据错乱)。
当我们链接数据库时时每个线程开一个链接,这样来了很多请求之后,链接过多会极大的消耗网络、内存资源导致系统运行速度过慢,甚至卡死。
所以针对于flask中我们使用第三方模块dbutils来管理数据库链接数量,这样每次线程执行数据库相关操作都只是从连接池中获取一个连接来进行,无论多少线程过来都只会轮流交替使用连接池的中连接。
DBUtils是Python的一个用于实现数据库连接池的模块
此连接池有两种连接模式:
DBUtils提供两种外部接口:
- PersistentDB :提供线程专用的数据库连接,并自动管理连接。
- PooledDB :提供线程间可共享的数据库连接,并自动管理连接。
安装 dbutils
pip3 install dbutils
dbutils使用
PersistentDB模式:
为每个线程创建一个连接,线程即使调用了close方法,也不会关闭,只是把连接重新放到连接池,供自己线程再次使用。当线程终止时,连接自动关闭
PooledDB 模式:
创建一批连接到连接池,供所有线程共享使用。
示例以PooledDB 模式为例:
创建一个py文件,用来配置连接池
pool.py
from dbutils.pooled_db import PooledDB
import pymysql
POOL=PooledDB(
creator=pymysql, # 使用链接数据库的模块
maxconnections=6, # 连接池允许的最大连接数,0和None表示不限制连接数
mincached=2, # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
maxcached=5, # 链接池中最多闲置的链接,0和None不限制
maxshared=3, # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。
blocking=True, # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
maxusage=None, # 一个链接最多被重复使用的次数,None表示无限制
setsession=[], # 开始会话前执行的命令列表。
ping=0,
# ping MySQL服务端,检查是否服务可用。
host='127.0.0.1',
port=3306,
user='root',
password='123',
database='test',
charset='utf8'
)
测试连接池代码
from flask import Flask
from pool import POOL
app = Flask(__name__)
app.debug = True
@app.route('/')
def show_db():
# 从池中拿链接,创建出cursor对象
conn = POOL.connection()
cursor = conn.cursor()
cursor.execute('select * from bbc')
print(cursor.fetchall())
return '查询成功'
if __name__ == '__main__':
app.run()
二、wtfroms
wtfroms用于前后端混合的项目,与django中的forms类似
用于校验数据,渲染页面,显示提示信息
安装
pip3 install wtforms
使用
创建一个py文件编写wtforms
myform.py
from flask import Flask, render_template, request
from wtforms.fields import simple
from wtforms import Form
from wtforms import validators
from