找回密码
 立即注册
首页 业界区 安全 Python Flask框架入门_4.通过token认证验证API的访问权 ...

Python Flask框架入门_4.通过token认证验证API的访问权限(集成数据库连接池版本)

轮达 5 小时前
由于链接数据库频繁操作导致性能损耗严重,需使用连接池机制进行数据库优化:
下载并引入dbunits模块实现数据库连接池配置:
  1. (.venv) PS D:\PythonProject2> pip install dbutils
  2. Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
  3. Collecting dbutils
  4.   Downloading https://pypi.tuna.tsinghua.edu.cn/packages/98/a7/4fe7da3082241028e62c390bf9357d60522dd03d9329e3a560045fe14dfd/dbutils-3.1.2-py3-none-any.whl (32 kB)
  5. Installing collected packages: dbutils
  6. Successfully installed dbutils-3.1.2
  7. [notice] A new release of pip is available: 25.1.1 -> 25.2
  8. [notice] To update, run: python.exe -m pip install --upgrade pip
  9. (.venv) PS D:\PythonProject2>
复制代码
  1. from dbutils.pooled_db import PooledDB
复制代码
创建连接池:
  1. POOL = PooledDB(
  2.     creator=pymysql, # 使用链接数据库的模块
  3.     maxconnections=10, # 连接池允许的最大连接数,0和None表示不限制连接数
  4.     mincached=2, # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
  5.     maxcached=5, # 链接池中最多闲置的链接,0和None不限制
  6.     blocking=True, # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
  7.     setsession=[], # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]
  8.     ping=0,
  9.     host='127.0.0.1', port=3306, user='root', passwd='rootpassword', charset="utf8", db='day20'
  10. )
复制代码
连接池优化性能:
连接池配置最大10个连接,动态创建与回收闲置链接
阻塞模式等待连接释放,闲置链接超限自动清理
通过pull_connection从池中获取并归还数据库连接
完整代码如下:
  1. import hashlibimport pymysqlfrom flask import Flask, request, jsonifyfrom dbutils.pooled_db import PooledDBapp = Flask(__name__)# 创建连接池POOL = PooledDB(
  2.     creator=pymysql, # 使用链接数据库的模块
  3.     maxconnections=10, # 连接池允许的最大连接数,0和None表示不限制连接数
  4.     mincached=2, # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
  5.     maxcached=5, # 链接池中最多闲置的链接,0和None不限制
  6.     blocking=True, # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
  7.     setsession=[], # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]
  8.     ping=0,
  9.     host='127.0.0.1', port=3306, user='root', passwd='rootpassword', charset="utf8", db='day20'
  10. )# 连接MySQL,执行SQL查询语句,返回结果def fetch_one(sql,params):    # conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='rootpassword', charset="utf8", db='day20')    conn = POOL.connection()    cursor = conn.cursor()    # cursor.execute("select * from user where token=%s", [token, ])    cursor.execute(sql, params)    result = cursor.fetchone()    cursor.close()    conn.close()# 不是关闭连接,而是将连接交还到连接池中    print("result", result)    return result@app.route("/bili", methods=["POST"])def bili():    """    请求URL中携带/bili?token=...    请求的数据格式要求:{ "ordered_string":"......" }    :return:    """    # 1.token是否为空    token = request.args.get("token")    print("token", token)    if not token:        return jsonify({"status":False , 'error':"认证失败"})    # 从数据库表中读取授权码的情况    # 连接MYSQL执行命令,验证token是否合法    result = fetch_one("select * from user where token=%s", [token, ])    if not result:        return jsonify({"status": False, "error": "认证失败"})    ordered_string = request.json.get("ordered_string")    if not ordered_string:        return jsonify({"status": False, "error": "参数错误"})    # 调用核心算法,生成sign签名    encrypt_string = ordered_string + "560c52ccd288fed045859ed18bffd973"    obj = hashlib.md5(encrypt_string.encode('utf-8'))    sign = obj.hexdigest()    # 返回签名    return jsonify({"status": True, "data": sign})if __name__ == '__main__':    app.run(host="127.0.0.1",port=5000)
复制代码
进行测试:
1.png


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册