蓝图的使用,g对象,数据库连接池
蓝图的使用
# blurprint 就是蓝图的意思
# 蓝图就是为了划分目录的
# 蓝图的使用步骤
第一步:导入蓝图 from flask import Blueprint
第二步:实例化得蓝图对象 uc=Blueprint('user',__name__)
第三步:在app中注册蓝图 @app.register_blueprint(us)
第四步:在不同的views.py使用注册路由 @us.route('/login')
# 补充
蓝图可以有自己的静态文件和模板
注册蓝图时,可以使用前缀,必须以/开头
# 划分项目
# 使用蓝图,划分小型项目目录
little_blueprint # 项目名
-src # 核心代码
-static # 静态文件
-1.jpg # 图片
-templates # 模板文件
-user.html # 模板
-views # 视图函数存放位置
-order.py # 订单相关视图
-user.py # 用户相关视图
-__init__.py # 包
-models.py # 表模型
-manage.py # 启动文件
# 使用蓝图,划分大型项目目录 多个app,像django一样
big_blueprint # 项目名
-src # 核心文件
-admin # admin的app
-static # 静态文件
-1.jpg # 图片
-templates # 模板文件目录
-admin_home.html # 模板文件
-__init__.py # 包
-models.py # 表模型
-views.py # 视图函数
-home # home app
-order # orderapp
-__init__.py # 包
-settings.py # 配置文件
-manage.py # 启动文件
g对象
g对象:专门用来存储用户信息的
是global的缩写,在Python中是个关键字,因为不能以关键字作为变量名,干脆用了g
全局变量, 在任意位置导入使用即可
g对象在一次请求中的所有代码的地方,都是可以使用的
# 作用:上下文
其实是请求的上下文,从请求进来,就有,到请求走了,一直存在,所以在当次请求过程中,如果调用别的函数,不需要把参数传入,只需要放到g对象中,在别的函数中直接使用g获取即可
# django中有类似这样的东西:request.context
# 为什么不把变量放到request对象中?
担心把request原来的属性替换掉
g对象和session的区别
session对象是可以跨request的,只要session还未失效,不同的request的请求会获取到同一个session,但是g对象不是啊,对象不需要管过期时间,请求一次就g对象就改变了一次,或者重新赋值了一次。
- g对象只针于当次请求
- session针对所有请求
from flask import Flask, g, request
# g 对象
app = Flask(__name__)
app.debug = True
def add():
a = g.a
b = g.b
return a + b
# 写个请求扩展,before_request
@app.before_request
def before():
request.name = 'zx'
if 'home' not in request.path:
g.name = 'zx'
@app.after_request
def after(response):
print('---', g.name)
return response
@app.route('/')
def index():
g.a = 13
g.b = 2
res = add()
print(res)
return 'zx'
@app.route('/home')
def home(): # 报错,g对象只针对当次请求有效
print(g.name)
return 'ZX'
if __name__ == '__main__':
app.run()
数据库连接池
flask中集成mysql
# flask 操作mysql
import time
from flask import Flask, jsonify
import pymysql
app = Flask(__name__)
app.debug = True
@app.route('/article')
def article():
# 第一步:链接mysql
conn = pymysql.connect(host='127.0.0.1', port=3306, database='cnblogs', password='', user='root')
cursor = conn.cursor()
cursor.execute('select * from article')
res = cursor.fetchall()
cursor.close()
conn.close()
print(res)
return jsonify(res)
if __name__ == '__main__':
app.run()
# flask 操作mysql
-使用pymysql
-在视图函数中,创建pymysql的连接,查数据,查完,返回给前端
-出现的问题: 来一个请求,创建一个连接,请求结束,连接关闭 (djanog就是这么做的)
-把连接对象,做成全局的,在视图函数中,使用全局的连接,查询,返回给前端
-出现的问题:会出现数据错乱
# 解决上面的两个问题
-数据库连接池
-创建一个全局的池
-每次进入视图函数,从池中取一个连接使用,使用完放回到池中,只要控制池的大小,就能控制mysql连接数
# 使用第三方数据库连接池,使用步骤
-1 安装 pip install dbutils
-2 使用:实例化得到一个池对象
-3 在视图函数中导入使用
conn = pool.connection()
cursor = conn.cursor(pymysql.cursors.DictCursor)
cursor.execute('select id,title,author_img from aritcle limit 2')
res = cursor.fetchall()
# 使用池的
import time
import random
from POOL import pool
@app.route('/article_pool')
def article_pool():
conn = pool.connection()
cursor = conn.cursor(pymysql.cursors.DictCursor)
cursor.execute('select id,title,author_img from aritcle limit 2')
res = cursor.fetchall()
print(res)
return jsonify(res)
@app.route('/article')
def article():
conn = pymysql.connect(user='root',
password="",
host='127.0.0.1',
database='cnblogs',
port=3306)
cursor = conn.cursor(pymysql.cursors.DictCursor)
time.sleep(random.randint(1,3))
cursor.execute('select id,title,author_img from aritcle limit 2')
res = cursor.fetchall()
cursor.close()
conn.close()
return jsonify(res)
if __name__ == '__main__':
app.run()
import time
import random
from POOL import pool
# 使用池的
@app.route('/article_pool')
def article_pool():
conn = pool.connection()
cursor = conn.cursor(pymysql.cursors.DictCursor)
cursor.execute('select id,title,author_img from aritcle limit 2')
res = cursor.fetchall()
print(res)
return jsonify(res)
# 不使用池的
@app.route('/article')
def article():
conn = pymysql.connect(user='root',
password="",
host='127.0.0.1',
database='cnblogs',
port=3306)
cursor = conn.cursor(pymysql.cursors.DictCursor)
time.sleep(random.randint(1,3))
cursor.execute('select id,title,author_img from aritcle limit 2')
res = cursor.fetchall()
cursor.close()
conn.close()
return jsonify(res)
if __name__ == '__main__':
app.run()