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
# 这样就可以传递多个参数 给到命令函数