首页 > 数据库 >flask_day03:蓝图的使用、g对象、数据库连接池

flask_day03:蓝图的使用、g对象、数据库连接池

时间:2023-04-04 23:13:07浏览次数:36  
标签:__ py flask 蓝图 request cursor day03 session 连接池

目录

回顾

1.cbv的使用
	写一个类继承MethodView,写get、post。。。
 	类属性decorators = [auth,] 可以加装饰器
  
2.cbv执行流程
	2.1 跟Django流程一样
  2.2 endpoint作用路径别名,add_url_rule(view_func=IndexView.as_view('index'))
  2.3 为什么endpoint不传,是被路由装饰器的函数名:函数.__name__
  2.4 装饰器的执行先后顺序
  
3.请求响应
	请求:全局request对象,在不同视图函数中尽管使用,不会错乱
  method
  path
  files
  form
  argvs。。。
  响应:四件套,响应对象,make_response包裹一下四件套之一
  set_cookies
  响应对象.headers 响应头
 
4.session使用
	设置秘钥
  全局导入,直接赋值,取值
  
5.session执行流程
	open_session: 前端写到cookie到后端,后端取出cookie对应的value值,解密,转到session兑对象中,后续再视图函数中,使用session即可
  save_session: 请求走的时候,校验session有没有被改过,如果被改了,删除cookie,重新设置cookie。session改了就删除cookie,没改就用原来的,而在Django是修改session表中的value值。
    
  session用起来像字典 --->>> 如何做,一个对象可以像字典一样使用,__getitem__ __setitem__,只要调用__setitem__就说明动了,对象属性modify,一开始false,只要触发了__setiten__,置为true,后期只要判断modify,就可以判断session有没有被改过

  
6.闪现;跨域请求获取到之前请求存放的数据,取一次就没了     关注一下Django的message框架
	flash('%s,对不起'% name)
  get_flashed_messages()
  
7. 请求扩展
	before_request
  after_request
  before_first_request
  teardown_request: 错误日志记录
  errorhandler:是某种状态码,就会执行它

蓝图的使用

blueprint 翻译过来的,称之为蓝图

作用是:之前全在一个py中写flask项目中,后期肯定要划分目录

不用蓝图,划分目录

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

image-20230404171453743

蓝图的使用步骤

第一步:导入蓝图类

flask import Blueprint

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

us=Blueprint('user', __name__)

第三步:在app中注册蓝图

app.register_blueprint(us)

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

@us.route('/login')
补充:蓝图可以有自己的静态文件和模板
补充:注册蓝图时,可以使用前缀,必须以/ 开头

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

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

image-20230404182003497

image-20230404181240332

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

有多个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对象是什么?

专门用来储存用户信息的g对象,g的全称为global

global的缩写,再python中是个关键字,不能以关键字作为变量名,干脆就用了g。

  • g 对象,在整个请求的全局,可以放值,可以取值

  • 全局变量,在任意位置导入使用即可

什么不学Django中使用request作为上下文?

  • 因为使用request,可能会造成request数据的污染,不就会小心改了request的属性,而却发现不了

  • 建议使用g是空的,放入之后在当次请求中全局优先

使用场景

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

g和session有什么区别?

  • g 是只针对与当次请求,而session是针对于多次请求

  • 解释:

    session对象是可以跨request的,只要session还未失效,不同的request的请求会获取到同一个session,但是g对象不是,g对象不需要管过期时间,请求一次就g对象就改变了一次,或者重新赋值了一次

代码:

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()

数据库连接池

flask操作mysql

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

image-20230404185703523

  • 解决上面的两个问题

    数据库连接池

    ​ 1.创建一个全局的池

    ​ 2.每次进入视图函数,从池中取一个连接使用,使用完放回池中,只要控制池的大小,就能控制mysql的连接数

使用第三方数据库连接池

使用步骤

1.安装 pip install dbutils
2.使用:实例化得到一个池对象
3.在视图函数中导入使用
	conn = pool.connection()
  cursor = conn.cursor(pymysql.cursor.DictCursor)
  cursor.execute('select id, title, author_img from article limit 2')
  res = cursor.fetchall()
  
# 带池的代码
@app.route('/article_pool')
def article_pool():
	conn = pool.connection()
  cursor = conn.cursor(pymysql.cursors.DictCursor)
  cursor,execute('select id,title,author_img from article 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 = request.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%'

image-20230404101712742

-teardown_request 错误日志记录

-errorhandler 监听状态码

不用蓝图划分目录导来到去肯定会出现循环导入

image-20230404103728380

蓝图划分目录的

image-20230404104203765

蓝图的使用

蓝图小型项目的划分

image-20230404104854546

image-20230404104947662

image-20230404104956998

蓝图大型项目的划分

image-20230404120211432

全局的cursor导致数混乱

两个请求来

secuothermi

标签:__,py,flask,蓝图,request,cursor,day03,session,连接池
From: https://www.cnblogs.com/xiao-fu-zi/p/17288227.html

相关文章

  • flask02
    目录面试1.数据库的三大范式2mysql有哪些索引类型,分别有什么作用3.事务的特性和隔离级别上节课回顾今日内容1cbv分析1.1源码分析2模板2.1py2.2html3请求与响应4session及源码分析4.1session的使用4.2源码的分析5闪现6请求扩展面试1.数据库的三大范式1.数据库的三......
  • flask:cbv源码分析、模板语法、请求与响应、session及源码分析、闪现(flash)、请求扩展
    目录一、cbv源码分析1.1基于类的视图写法1.2源码分析1.3分析源码,查找不传别名的时候为什么函数名会变成别名1.4flask的路由注册使用装饰器,如果写了一个登录认证装饰器,那么应该放在路由装饰器上还是下?1.5dispatch_request讲解1.6知识点总结二、模板语法2.1py2.2html三、请......
  • flask之蓝图的使用-g对象-数据库连接池
    目录flask之蓝图的使用-g对象-数据库连接池昨日内容补充今日内容详细1蓝图的使用2g对象3数据库连接池补充flask之蓝图的使用-g对象-数据库连接池昨日内容补充#session执行流程 open_session:前端写到cookie到后端后端取出cookie对应的value值解密转到session对象中后续......
  • flask框架01 flask与pythonweb框架介绍 flask快速使用 登录显示用户信息案列 配置
    今日内容详细目录今日内容详细1Flask和pythonweb框架介绍1.1flask介绍2flask快速使用3登录,显示用户信息小案例3.1login.html3.2home.html3.3detail.html3.4py文件4配置文件方式5路由系统5.1转换器1Flask和pythonweb框架介绍pythonweb框架的本质都一样1.同步框架......
  • 【flask】蓝图的使用方式 g对象的使用 flask配置数据库连接池
    目录上节回顾今日内容1蓝图的使用2g对象g对象vsrequest对象3数据库连接池上节回顾全局request对象。线程会处理请求,确保线程中的数据不错乱。django_session表:#1cbv使用 -写一个类继承MethodView,写get,post。。。-类属性decorators=[auth,]可以加装饰器......
  • flask框架02 cbv分析 模板 请求与响应 session 闪现 请求拓展
    今日内容详细目录今日内容详细1cbv分析1.1源码分析2模板2.1py文件2.2html页面3请求与响应4session及源码分析4.1session的使用4.2源码分析5闪现6请求拓展1cbv分析#基于类的视图,写法fromflaskimportFlask,requestfromflask.viewsimportView,MethodView......
  • flask,蓝图使用,g对象,数据库连接池
    内容回顾cbv使用写一个类继承MethodView写get,post…类属性decorators=[auth]可以加装饰器CBV执行流程跟django的执行流程一样endpoint作用路径别名add_url_rule(view_func=IndexView.as_view(‘index’))为什么endpoint不传,是被路由装饰器装饰的函数名:函数名._name_装饰......
  • flask3
    今日内容1蓝图的使用#blueprint翻译过来的,称之为蓝图#作用是:之前全在一个py中写flask项目,后期肯定要划分目录#不用蓝图,划分目录 no_blueprint_flask#项目名src#核心源码位置__init__.py#包里面实例化得到了app对象,......
  • flask-蓝图、g对象
    1.蓝图的使用蓝图是由blueprint翻译过来的,作用是之前在一个py文件中写的flask项目,后期划分目录,不用蓝图同样可以划分项目1.1不用蓝图划分项目不使用蓝图划分也可以完成项目需求,但是随着项目深入导入情况越来越多可能会出现导入错误1.项目目录结构:根目录:srcinit.pymodels.......
  • Flask框架使用蓝图划分目录、g对象、使用数据库连接池链接数据库
    目录一、使用蓝图划分项目目录1.蓝图的介绍2.蓝图的使用二、介绍flask框架的g对象1.g对象是什么?2.使用代码再次解释g对象三、使用数据库连接池链接数据库1.引入数据库连接池的概念2.在flask框架中使用数据库连接池的步骤一、使用蓝图划分项目目录1.蓝图的介绍flask框架的目......