蓝图的使用,g对象,数据库连接池

蓝图的使用,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()

posted @ 2023-04-06 16:53  小王应该在学习!  阅读(116)  评论(0编辑  收藏  举报