Title

蓝图,flask-session,数据库连接池

1 蓝图

# blueprint :蓝图,flask都写在一个文件中,项目这样肯定不行,分目录,分包,使用蓝图划分目录


# 不用蓝图,划分目录
	-一直使用app对象,会出现循环导入问题
    -项目名
        static
        templates
            order_detail.html
        views
            __init__.py
            goods.py
            order.py
            user.py
        manage.py
        
   -代码看详情




# 使用蓝图:所有步骤
	-1 实例化得到一个蓝图对象
    	-order_blue=Blueprint('order',__name__,template_folder='../templates')
    -2 以后注册路由,写请求扩展,都使用蓝图
    	@user_blue.before_request
        @user_blue.route('/register')
    -3 在app中注册蓝图
    	from . import user
    	app.register_blueprint(user.user_blue)
        app.register_blueprint(user.user_blue,url_prefix='/user')
    	

1.1 使用蓝图

1.2 蓝图小型项目

flask_blueprint_little  #  项目名
	src                # 核心文件
        __init__.py     #包的inin里面实例化得到app对象
        views           # 视图函数,类
            user.py
            order.py
        templates       #模板
            user.html
        static         #静态文件
    
    manage.py          #启动文件


1.3 蓝图大型项目

   src
    admin
        static
        template
        __init__.py
        models.py
        views.py
    __init__.py
    pool.py
    settings.py
  manage.py

2 flask-session

# flask 自带session---》以cookie的形式放到了浏览器中---》加密

#真正的session,是在服务端存储
	-django中存在djangosession表中
    -flask中,使用第三方,保存在---》redis中---》flask-session

#flask能不能用jwt


# 使用步骤
	pip3 install flask-session
    
# 降一下flask版本即可
# 用高版本:在app中放一个参数  app.session_cookie_name='session'


# 使用方式一:
    from flask_session import RedisSessionInterface
    app.session_cookie_name='session'
    app.session_interface=RedisSessionInterface(redis=None,key_prefix='lqz')  # 动态替换,把原来的session对象换成放到redis的session对象
    # 4 以后再使用session,就会存到redis中了
    session.get()
    session[]=value赋值
    
# 使用方式二:
	from redis import Redis
    from flask_session import Session
    app.session_cookie_name = 'session'
    app.config['SESSION_TYPE'] = 'redis'
    app.config['SESSION_REDIS'] = Redis(host='127.0.0.1',port='6379')
    Session(app)
    
    
    
    
        @blue.route('/home')
        def home():
            session['lyx']='lyx'
            return jsonify({'code': 200, "msg": "成功"})

        @blue.route('/')
        def index():
            print(session.get('lyx'))
            return jsonify({'code': 200, "msg": "成功"})

3 数据库连接池

# flask---》数据库---》原生操作---》pymsql

3.1 数据库连接池

# 1 安装:DBUtils
# 2 使用 类创建一个池对象
PYMYSQL_POOL = PooledDB(
    creator=pymysql,  # 使用链接数据库的模块
    maxconnections=2,  # 连接池允许的最大连接数,0和None表示不限制连接数
    mincached=1,  # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
    maxcached=0,  # 链接池中最多闲置的链接,0和None不限制
    maxshared=3,
    # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。
    blocking=True,  # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
    maxusage=None,  # 一个链接最多被重复使用的次数,None表示无限制
    setsession=[],  # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]
    ping=0,
    # ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123',
    database='cars',
    charset='utf8'
)
# 3 从池对象中,取出一个链接使用
	conn = PYMYSQL_POOL.connection()

    
    
# 4 flask中使用
from flask import jsonify, session
from pymysql.cursors import DictCursor

from . import blue
from flask_session import Session
from ..pool import PYMYSQL_POOL
@app.route('/')
def index():
    conn = PYMYSQL_POOL.connection()  # 从池中拿一个链接
    cursor = conn.cursor(cursor=DictCursor)  # 默认元组套元组,设置DictCursor就是列表套字典
    cursor.execute('select id,title from news where id<10')
    res1 = cursor.fetchall()
    cursor.close()
    conn.close()
    return jsonify(res1)
    
posted @ 2023-08-04 15:56  哈哈哈哼  阅读(9)  评论(0编辑  收藏  举报