首页 > 数据库 >flask蓝图、g对象、数据库连接池

flask蓝图、g对象、数据库连接池

时间:2023-04-17 16:15:03浏览次数:43  
标签:__ py flask app 蓝图 request cursor 连接池

昨日回顾

# 1 cbv 使用
   写一个类继承MethodView,写get,post...
   类属性decorators = [auth,]可以加装饰器

# 2 cbv执行流程
   1 跟django流程一样
   2 entpint 作用路径别名,add_url_rule(view_func=Index.as_view('index'))
   3 为什么entpint不传,是被路由装饰器装饰的函数名:函数.__name__
   4 装饰器的执行先后顺序

# 3 模板语法

# 4 请求响应
    请求:全局request对象,在不同视图函数中尽管使用,不会错乱
          -method
          -path
          -files
          -form
          -argvs...
    响应:四件套
          -响应对象,make_response包裹一下四件套之一
          -set_cookies
          -响应对象.headers 响应头
        
# 5 session使用
    设置密钥
    全局导入,直接赋值,取值
    
# 6 session执行流程
    -open_session:前端写到cookie到后端,后端取出cookie对应的value值,解密,转到session对象中,后续在视图函数中,使用session即可
    -save_session:请求走的时候,校验session有没有被改过,如果被改了,删除cookie,重新设置cookie
        
    -session用起来像字典---》如何做,一个对象可以像字典一样使用,__getitem__  __setitem__,只要调用__setitem__ 就说明动了,对象属性 modify,一开始false,只要触发了__setitem__,置为true,后期只要判断modify,就可以判断session有没有被改过
    
# 7 闪现:跨请求获取到之前请求存放的数据,取一次就没了 关注django的message框架
    -flash('%s,大帅哥'%name)
    -get_flashed_messages()
    
# 8 请求扩展
    -before_request
    -after_request
    -before_first_request
    -teardown_request:错误日志记录
    -errorhandler:是某种状态码,就会执行它

今日内容

  • 蓝图的使用

  • g对象

  • 数据库连接池

1 蓝图的使用

# blueprint 翻译过来的,称之为蓝图
作用是:之前全在一个py文件中写flask项目,后期肯定要划分目录

# 不用蓝图,划分目录
    no_blueprint_flask  # 项目名
       src              # 核心源码位置
          __init__.py   # 包 里面实例化得到了app对象
          models.py     # 放表模型
          views.py      # 放视图函数
       static           # 放静态资源
       templates        # 放模板
          home.html     # 模板
       manage.py        # 启动文件

1.1 蓝图的使用步骤

第一步:导入蓝图类

from flask import Blueprint

第二步:实例化得到蓝图对象

us=Blueprint('user',__name__)

第三步:在app中注册蓝图

app.register_blueprint(us)

第四步:在不同的views.py 使用蓝图注册路由

@us.route('/login')

补充

蓝图可以有自己的静态文件和模板
注册蓝图时,可以使用前缀,必须以/开头

1.2 使用蓝图,划分小型项目目录

# 使用蓝图,划分小型项目目录

    little_blueprint       # 项目名
       -src                # 核心代码
          -static          # 静态文件
             -1.png        # 图片
          -templates       # 模板文件
             user.html     # 模板
          -views           # 视图函数存放位置
             order.py      # 订单相关视图
             user.py       # 用户相关视图
          -__init__.py     # 包
          -models.py       # 表模型
       -manage.py          # 启动文件

1.3 使用蓝图,划分大型项目目录

# 使用蓝图,划分大型项目目录  多个app,像django一样

big_blueprint                    # 项目名
    -src                         # 核心文件
       -admin                    # admin的app 
           -static               # 静态文件
              -1.png             # 图片
           -templates            # 模板文件目录
              -admin_home.html   # 模板文件
           -__init__.py          # 包
           -models.py            # 表模型
           -views.py             # 视图函数
      -home                      # home app
      -order                     # order app
      -__init__.py               # 包
      -settings.py               # 配置文件
    -manage.py                   # 启动文件

2 g对象

# g 对象 是什么?
    -global的缩写,在python中是个关键字,不能以关键字作为变量名,干脆用了g
    -g 对象,在整个请求的全局,可以放值,可以取值
    -全局变量,在任意位置导入使用即可
    
# 它为什么不学django使用request作为上下文?
  因为使用request,可能会造成request数据的污染,不小心改了request属性,但你不知道
  建议使用g 是空的,放入之后在当次请求中全局优先

# 以后想在当次请求中,放入一些数据,后面使用,就可以使用g对象


# g和session有什么区别?
  g 只针对于当次请求
  session针对于多次请求
from flask import Flask, g, request

app = Flask(__name__)
app.debug = True


@app.before_request
def before():
    if 'home' in request.path:
        g.xx = 'xx'


def add(a, b):
    print('----', g.name)
    print('----', request.name)
    return a + b


@app.route('/')
def index():
    print(g.xx)
    name = request.args.get('name')
    g.name = name
    request.method = name
    res = add(1, 2)
    print(res)
    return 'index'


@app.route('/home')
def home():
    print(g.xx)
    return 'index'


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

3 数据库连接池

# flask 操作mysql
  -使用pymysql
  -在视图函数中,创建pymysql的连接,查数据,查完,返回给前端
     -有什么问题? 来一个请求,创建一个连接,请求结束,连接关闭(django就是这么做的)
    
  -把连接对象,做成全局的,在视图函数中,使用全局的连接,查询,返回给前端
     -有什么问题?会出现数据错乱,详见下图

image-20230404180743942

# 解决上面的两个问题
  -数据库连接池
  -创建一个全局的池
  -每次进入视图函数,从池中取一个连接使用,使用完放回到池中,只要控制池的大小,就能控制mysql连接数

3.1 使用第三方数据库连接池,使用步骤

安装 pip install dbutils

使用:实例化得到一个池对象

在试图函数中导入使用

from dbutils.pooled_db import PooledDB
import pymysql
 
pool = PooledDB(
    creator=pymysql,  # 使用链接数据库的模块
    maxconnections=10,  # 连接池允许的最大连接数,0和None表示不限制连接数
    mincached=2,  # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
    maxcached=5,  # 链接池中最多闲置的链接,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='root',
    database='luffy01',
    charset='utf8'
)
 
conn = pool.connection()
 
cursor = conn.cursor(pymysql.cursors.DictCursor)
cursor.execute('select * from luffy_banner limit 2')
res = cursor.fetchall()
print(res)

带池的代码

# 带池的代码
@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)

压力测试代码

# 压力测试代码
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()

效果是池的连接数明显小

不使用池连接数明显大

查看数据库连接数

show status like 'Threads%'

标签:__,py,flask,app,蓝图,request,cursor,连接池
From: https://www.cnblogs.com/super-xz/p/17326156.html

相关文章

  • flask请求上下文分析(request原理)、wtforms
    上节回顾#1蓝图第一步:导入第二步:实例化得到对象,可以指定static和templates第三步:app中注册蓝图,注册蓝图时,可以指定前缀第四步:使用蓝图,注册路由,注册请求扩展#2g对象当次请求的全局对象,在当次请求中可以放值和取值跟session的区别是session可......
  • flask信号、flask-script、sqlalchemy介绍和快速使用
    昨日内容回顾#1导出项目依赖pipreqs#2函数和方法的区别#3local对象-并发编程中的一个对象,它可以保证多线程并发访问数据安全-本质原理是:不同的线程,操作的是自己的数据-不支持协程#4自己定义local,支持线程和协程#注意点一:try:......
  • flask的sqlalchemy快速插入数据、scoped_session线程安全、基本的增删查改、一对多、
    今日内容sqlalchemy快速插入数据scoped_session线程安全基本的增删改查一对多多对多连表查询1sqlalchemy快速插入数据#sqlalchemy是什么ORM框架,跟其他web框架没有必然联系,可以独立使用#安装,快速使用,执行原生sql#创建表和删除表-不能创建......
  • flask-sqlalchemy使用、flask-migrate使用、flask项目演示
    昨日内容回顾#1sqlalchemy创建表:Base=declarative_base()-只能创建和删除-不能创建数据库-不能修改表#2快速插入数据-借助于session对象fromsqlalchemy.ormimportsessionmakerSession=sessionmaker(bind=engine)session......
  • Flask001_环境搭建
    Python环境查看Python版本python--versionFlask版本安装Flaskpipinstallfalsk查看Flask版本importflaskprint(flask.__version__)PycharmProfessional学习使用系统环境变量项目结构......
  • docker:Dockerfile、docker私有仓库、dockercompose介绍、dockercompose部署flask+redi
    目录一、Dockerfile1.1常用和不常用命令1.2dockerfile构建一个djagno项目二、docker私有仓库2.1镜像传到官方仓库2.2镜像分层2.3私有仓库搭建三、dockercompose介绍四、dockercompose部署flask+redis项目4.1新建flask项目app.py4.2编写Dockerfile--》用于构建flask项目的......
  • docker,Dockerfile,docker私有仓库,dockercompose介绍,dockercompose部署flask+redis项目,d
    内容回顾容器操作dockerstart容器id启动容器dockerstop容器id停止容器dockerrm 容器id删除容器ockerrm`dockerps-aq`#正在运行的容器不能删除dockerexec容器id命令让容器执行命令dockercp宿主机目录容器id:容器目录#目录要存在dockercp容......
  • 轻量级Web框架Flask(二)
    Flask-SQLAlchemyMySQL是免费开源软件,大家可以自行搜索其官网(https://www.MySQL.com/downloads/)测试MySQL是否安装成功在所有程序中,找到MySQL→MySQLServer5.6下面的命令行工具,然后单击输入密码后回车,就可以知道MySQL数据库是否链接成功。右击桌面上的“计算机”,在弹出的快......
  • SSE协议及flask实现
    介绍服务器推送事件:Server-SentEvents,SSE特点仅从服务器向客户端实现单向实时通信。实现简单,基于HTTP协议。浏览器端有断线重连功能。支持用户自定义消息类型。用来传送文本,二进制需要编码。flask-sse实现flask-sse文档前置条件本地Redis服务器gunicorngeven......
  • docker01 flask-sqlalchemy flask-migrate使用 flask项目演示 docker介绍与安装
    今日内容详细目录今日内容详细1flask-sqlalchemy使用2flask-migrate使用3flask项目演示4docker介绍4.1什么是虚拟化4.2docker是什么4.3容器与虚拟机比较4.4Docker概念5docker安装1flask-sqlalchemy使用#集成到flask中,直接使用sqlalchemy,看代码#有个第三方flask-sq......