Flask框架使用蓝图划分目录、g对象、使用数据库连接池链接数据库
目录
一、使用蓝图划分项目目录
1.蓝图的介绍
flask框架的目录结构没有很大的强制性,可以随意根据自己的喜好来搭建项目目录。也就是说flask框架的可塑造型非常强。当然有第三方模块来实现划分目录。当然其实可以不用蓝图也能划分目录。app对象在全局在用,因此导来导去一定会出现循环导入问题,因此使用蓝图来划分目录就可以解决该问题。以下三张图是三种划分目录的效果图,那么接下来研究一下使用蓝图具体实现划分目录吧
- 不使用蓝图划分项目目录结构
- 使用蓝图划分小型项目目录结构
- 使用蓝图划分大型项目目录结构
2.蓝图的使用
第一步:在app包的双下init.py文件导入蓝图类并得到实例化对象
from flask import Blueprint
admin_bp = Blueprint('admin', __name__, static_folder='static', template_folder='templates')
from . import views # 这个导入语句不能放到最上面,只能蓝图实例化对象下面放
第二步:在src跟目录的双下init.py文件里面注册蓝图
from flask import Flask
from .admin import admin_bp
app = Flask(__name__)
app.config.from_pyfile('settings.py')
app.register_blueprint(admin_bp, url_prefix='/admin')
第三步:在不同的views.py 使用蓝图注册路由
from flask import render_template
from . import admin_bp
@admin_bp.route('/home')
def home():
return render_template('Admin.html')
最后可以正常访问路由,说明使用蓝图划分目录成功了
二、介绍flask框架的g对象
1. g对象是什么?
global的缩写,在python中是个关键字,不能以关键字作为变量名,干脆用了g;g对象,在整个请求的全局,可以放值,可以取值全局变量,在任意位置导入使用即可。
- 那么它为什么不学django使用request作为上下文?
因为使用request,可能会造成request数据的污染,不小心改了request的属性,但你不知道建议使用g 是空的,放入之后在当次请求中全局优先,以后想在当次请求中,放入一些数据,后面使用,就可以使用g对象。 - g和session有什么区别?
g 是只针对于当次请求
session针对于多次请求
2. 使用代码再次解释g对象
from flask import g
from . import home_bp
def add(a, b):
print('---', g.name)
return a + b
@home_bp.route('/use_g')
def use_g():
g.name = 'lll'
res = add(1, 2)
print(res)
return '魔鬼变量g'
三、使用数据库连接池链接数据库
1. 引入数据库连接池的概念
flask操作mysql使用pymysql,在视图函数中创建pymysql的连接,查数据,查完,返回给前端有什么问题? 来一个请求,创建一个连接,请求结束,连接关闭(djanog就是这么做的)把连接对象,做成全局的,在视图函数中,使用全局的连接,查询,返回给前端有什么问题?会出现数据错乱。解决上面的两个问题,数据库连接池、创建一个全局的池、每次进入视图函数,从池中取一个连接使用,使用完放回到池中,只要控制池的大小,就能控制mysql连接数。
2. 在flask框架中使用数据库连接池的步骤
第一步:安装第三方模块
pip install dbutils
第二步:实例化得到一个池对象
from dbutils.pooled_db import PooledDB
import pymysql
pool = PooledDB(
creator=pymysql,
maxconnections=10,
mincached=2,
maxcached=5,
maxshared=3,
blocking=True,
maxusage=None,
setsession=[],
ping=0,
host='127.0.0.1',
port=3306,
user='luffy',
password='Luffy123?',
database='luffy',
charset='utf8'
)
第三步:在视图函数中导入使用
import pymysql
from flask import jsonify
from . import user_bp
from . import POOL
@user_bp.route('/list')
def list_info():
conn = POOL.pool.connection()
cursor = conn.cursor(pymysql.cursors.DictCursor)
cursor.execute('SELECT orders,title,image,link,info FROM luffy_banner')
res = cursor.fetchall()
return jsonify(res)
最后使用数据库连接池的方式查询数据库成功了