flask蓝图/G对象/连接数据库/导出项目依赖/信号的使用/自定制命令

蓝图使用

中大型项目推进使用蓝图来构建文件目录

1.导入蓝图类 from flask import Blueprint

2.实例化得到蓝图对象 order_bp = Blueprint('order', name)

3.在app中注册蓝图 app.register_blueprint(order_bp)

4.在不同的views.py 使用蓝图注册路由 @order_bp.route('/order')

目录结构

flaskProject                 项目名
	-src                       核心文件
  	-__init__.py             包(注册蓝图)
		-static                  放静态资源
		-templates               存放html页面
			-userpage.html
		-views                   放视图函数
			-order.py
			-user.py
		-models.py               表模型 数据库代码
manage.py                    启动文件
settings.py                  

src--init.py

from flask import Flask


app = Flask(__name__)

app.debug = True
app.secret_key = '123@@!@#!sdasd1@#!sdxcc'
from .views import user, order

app.register_blueprint(user.user_bp)
app.register_blueprint(order.order_bp)
# 注册蓝图

views文件夹----order.py

from flask import Blueprint

order_bp = Blueprint('user', __name__,
                     template_folder='templates',static_folder='static')

# 参数解析:template_folder 指template文件的地址,如果是跟views同一级别可直接填写,static_folder地址同级别直接填写即可

# 生成一个order的蓝图 


@order_bp.before_request
# 使用蓝图的扩展器(中间件)
def before():
    print('111')

# 注册路由
@order_bp.route('/order')
def order():
    return 'order'


@order_bp.route('/list')
def list():
    return 'order_list'

manage.py

# 项目启动文件
from src import app

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

g对象

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

from flask import Flask, g,
# 通过导入模块使用
# 可以理解为是一个存储数据的空白字典,可以直接往里面放数据
# 可以在其他函数中取出来 
# 取值 get 删除pop 设置默认值setdefault操作 

order_bp = Blueprint('order', __name__,)


@order_bp.before_request
def before():
    g.name = 'moon'


@order_bp.route('/order')
def order():
    print(g.pop('name'))
    return 'order'


@order_bp.route('/list')
def list():
    print(g.get('name'))
    return 'order_list'


链接mysql数据库

from flask import Blueprint, render_template,jsonify
import pymysql

user_bp = Blueprint('user', __name__, template_folder='templates', static_folder='static')


@user_bp.route('/mysql')
def mysql():
    conn = pymysql.connect(
        user='moongod',
        password="123",
        host='127.0.0.1',
        database='FlowProps',
        port=3306,
        charset="utf8",

    )
    # 创建mysql链接
    curser = conn.cursor(pymysql.cursors.DictCursor)
    # 指定生成字典类型数据
    curser.execute('select * from app_props limit 2')
    # 执行sql语句
    res = curser.fetchall()
    # 拿回所有结果
    print(res)
    cursor.close()
    conn.close()
    return jsonify(res)


@user_bp.route('/user')
def userinfo():
    return render_template('userpage.html', name='moon')

使用mysql链接池

创建一个数据库连接池
创建一个全局的池子
每次进入视图函数 从池中取一个连接使用 这样可以控制连接mysql连接数量过大

1. 安装 pip install dbutils
2. 使用:实例化得到一个池对象
3. 单独找个文件编写    
from dbutils.pooled_db import PooledDB
import pymysql

POOL = PooledDB(
    creator=pymysql,    # 使用链接数据库的模块
    maxconnections=10,  # 连接池允许的最大连接数,0和None表示不限制连接数
    mincached=3,  # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
    maxcached=5,  # 链接池中最多闲置的链接,0和None不限制
    maxshared=3,
    # 链接池中最多共享的链接数量
    blocking=True,  # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
    maxusage=10,  # 一个链接最多被重复使用的次数,None表示无限制
    setsession=[], 
    ping=0,
    # ping MySQL服务端,检查是否服务可用。
    host='127.0.0.1',
    port=3306,
    user='moongod',
    password='123',
    database='FlowProps',
    charset='utf8'
)


4.导入到视图函数使用

from src.pool import POOL

user_bp = Blueprint('user', __name__, template_folder='templates', static_folder='static')


@user_bp.route('/mysql')
def mysql():
    conn = POOL.connection()
    curser = conn.cursor(pymysql.cursors.DictCursor)
    curser.execute('select * from app_props limit 2')
    res = curser.fetchall()
    curser.close()
    conn.close()
    return jsonify(res)
  

哪个视图函数 需要 连接mysql 导过来连接即可

# 查看数据库连接数 sql语句
show status like 'Threads%'

压力测试

# 压力测试代码
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()
        
        
## 效果是:
	使用池的连接数明显小
  不使用池连接数明显很大

pipreqs的使用(导出项目依赖)

1. 下载 pipreqs 并安装
2. 命令行输出  pipreqs ./


这样直接就可以在当前路径下到处该项目用到的所有依赖了

信号的使用

Flask框架中的信号基于blinker,其主要就是让开发者可是在flask请求过程中定制一些用户行为,django也有

首先需要安装 blinker模块

from flask import Flask, signals

app = Flask(__name__)


# 1,写一个函数,
def test(*args, **kwargs):
    print(args)
    print(kwargs)
    print('信号')


# 2,绑定一个信号
signals.request_started.connect(test)
# 这是一个请求到来前执行的,所以只要访问就会触发信号的代码

# 3.等待信号触发

@app.route('/')
def home():
    return 'home'


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

自定义信号

导入模块
from flask.signals import _signals

from flask import Flask, signals
from flask.signals import _signals
# 导入自定义信号模块

app = Flask(__name__)

1.# 先自定义一个信号(名字根据业务命名)
signals_name = _signals.signal('signals_name')



2.# 写一个需要执行的功能函数
def set_session(*args, **kwargs):
    name = kwargs.get('name')
    print(name)
    print('信号触发了')

3.# 将函数和信号绑定
signals_name.connect(set_session)


@app.route('/')
def home():
    name = 'moon'
    signals_name.send(name=name)
 4.# 在需要执行的地方 触发信号 并可以传参数,
   # 这样就可以直接执行信号中的代码
    return 'home'


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

flask-script

如何在flask中使用命令

通过命令启动flask项目

1.安装  
  pip3.8 initall flask-script  2.0.3版本
  falsk 版本是 2.2.2
2.修改代码
创建一个manage.py文件
from flask import Flask
from flask_script import Manager

app = Flask(__name__)
# 关键就是这一句
manage = Manager(app)
app.secret_key = '123@@#!3'

@app.route('/')
def home():
    return 'hello'


if __name__ == '__main__':
    manage.run()
3.使用命令启动

python3.8 manage.py runserver

# 这样就可以使用命令启动程序了

flask自定义命令

在manage.py文件中

from flask import Flask
from flask_script import Manager

app = Flask(__name__)
manage = Manager(app)


# 简单命令,只有一个参数的
@manage.command
def init(*args):
    # 这里可以写逻辑代码,执行命令就会执行代码
    print(args)


if __name__ == '__main__':
    manage.run()
    
1.使用@manage.command装饰函数即可

2.执行命令 python3.8 manage.py init 参数

# init就是我们装饰的函数名,可以传递参数



#  复杂一些的自定制命令 精确传参的
@manage.option('-n', '--name', dest='name')
@manage.option('-a', '--age', dest='age')
def init(name, age):
    # 这里可以写逻辑代码,执行命令就会执行代码
    # 比如执行命令直接启动 celecy的 works 等等
    print(name, age)
        
# 执行命令 python3.8 manage.py init --name moon --age 18

# 这样就可以传递多个参数 给到命令函数


posted @ 2023-04-05 17:18  Python-moon  阅读(26)  评论(0编辑  收藏  举报