flask蓝图/G对象/连接数据库/

发布时间 2023-04-05 17:25:29作者: Python-moon

蓝图使用

中大型项目推进使用蓝图来构建文件目录

1.导入蓝图类 from flask import Blueprint

2.实例化得到蓝图对象 order_bp = Blueprint('order', name)

3.在app中注册蓝图 app.register_blueprint(order_bp)

4.在不同的views.py 使用蓝图注册路由 @order_bp.route('/order')

目录结构

flaskProject                 项目名
	-src                       核心文件
  	-__init__.py             包(注册蓝图)
		-static                  放静态资源
		-templates               存放html页面
			-userpage.html
		-views                   放视图函数
			-order.py
			-user.py
		-models.py               表模型 数据库代码
manage.py                    启动文件
settings.py                  

src--init.py

from flask import Flask


app = Flask(__name__)

app.debug = True
app.secret_key = '123@@!@#!sdasd1@#!sdxcc'
from .views import user, order

app.register_blueprint(user.user_bp)
app.register_blueprint(order.order_bp)
# 注册蓝图

views文件夹----order.py

from flask import Blueprint

order_bp = Blueprint('user', __name__,
                     template_folder='templates',static_folder='static')

# 参数解析:template_folder 指template文件的地址,如果是跟views同一级别可直接填写,static_folder地址同级别直接填写即可

# 生成一个order的蓝图 


@order_bp.before_request
# 使用蓝图的扩展器(中间件)
def before():
    print('111')

# 注册路由
@order_bp.route('/order')
def order():
    return 'order'


@order_bp.route('/list')
def list():
    return 'order_list'

manage.py

# 项目启动文件
from src import app

if __name__ == '__main__':
    app.run()

g对象

g对象在整个请求的全局 可以放值 可以取值

from flask import Flask, g,
# 通过导入模块使用
# 可以理解为是一个存储数据的空白字典,可以直接往里面放数据
# 可以在其他函数中取出来 
# 取值 get 删除pop 设置默认值setdefault操作 

order_bp = Blueprint('order', __name__,)


@order_bp.before_request
def before():
    g.name = 'moon'


@order_bp.route('/order')
def order():
    print(g.pop('name'))
    return 'order'


@order_bp.route('/list')
def list():
    print(g.get('name'))
    return 'order_list'


链接mysql数据库

from flask import Blueprint, render_template,jsonify
import pymysql

user_bp = Blueprint('user', __name__, template_folder='templates', static_folder='static')


@user_bp.route('/mysql')
def mysql():
    conn = pymysql.connect(
        user='moongod',
        password="123",
        host='127.0.0.1',
        database='FlowProps',
        port=3306,
        charset="utf8",

    )
    # 创建mysql链接
    curser = conn.cursor(pymysql.cursors.DictCursor)
    # 指定生成字典类型数据
    curser.execute('select * from app_props limit 2')
    # 执行sql语句
    res = curser.fetchall()
    # 拿回所有结果
    print(res)
    cursor.close()
    conn.close()
    return jsonify(res)


@user_bp.route('/user')
def userinfo():
    return render_template('userpage.html', name='moon')

使用mysql链接池

创建一个数据库连接池
创建一个全局的池子
每次进入视图函数 从池中取一个连接使用 这样可以控制连接mysql连接数量过大

1. 安装 pip install dbutils
2. 使用:实例化得到一个池对象
3. 单独找个文件编写    
from dbutils.pooled_db import PooledDB
import pymysql

POOL = PooledDB(
    creator=pymysql,    # 使用链接数据库的模块
    maxconnections=10,  # 连接池允许的最大连接数,0和None表示不限制连接数
    mincached=3,  # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
    maxcached=5,  # 链接池中最多闲置的链接,0和None不限制
    maxshared=3,
    # 链接池中最多共享的链接数量
    blocking=True,  # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
    maxusage=10,  # 一个链接最多被重复使用的次数,None表示无限制
    setsession=[], 
    ping=0,
    # ping MySQL服务端,检查是否服务可用。
    host='127.0.0.1',
    port=3306,
    user='moongod',
    password='123',
    database='FlowProps',
    charset='utf8'
)


4.导入到视图函数使用

from src.pool import POOL

user_bp = Blueprint('user', __name__, template_folder='templates', static_folder='static')


@user_bp.route('/mysql')
def mysql():
    conn = POOL.connection()
    curser = conn.cursor(pymysql.cursors.DictCursor)
    curser.execute('select * from app_props limit 2')
    res = curser.fetchall()
    curser.close()
    conn.close()
    return jsonify(res)
  

哪个视图函数 需要 连接mysql 导过来连接即可

# 查看数据库连接数 sql语句
show status like 'Threads%'

压力测试

# 压力测试代码
from threading import Thread
import requests


def task():
    res = requests.get('http://127.0.0.1:5000/article_pool')
    print(len(res.text))


if __name__ == '__main__':
    for i in range(500):
        t = Thread(target=task)
        t.start()
        
        
## 效果是:
	使用池的连接数明显小
  不使用池连接数明显很大