Flask框架内容基础2

一、使用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不在是关闭连接,而是将连接交还给连接池。

该部分内容有许多实现。线程池等与之原理类似。 

 

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值