今日内容概要
- 请求上下文简单分析
- flask-session(第三方)
- 数据库连接池
- 信号
- flask-script
内容详细
1、请求上下文简单分析
-假设同时来了3个请求,都在执行index视图函数---》3条线程在执行index
-三条线程分别放到local中,只要在当前线程中,再去local中取,取出来的就是当前线程的request
-使用request.method,我们发现,全局的request没有乱,不像djagno中一个请求一个request
-视图函数中因为同一次请求,包括请求扩展中使用,在同一个线程(协程)中,所以使用的是当次请求的request
-print(request)---><Request 'http://127.0.0.1:5000/' [GET]>
-print(session)---><SecureCookieSession {}>
-它俩是同一个类的对象吗?是LocalProxy本地代理类的对象,但是打印出来不一样
-LocalProxy原理是---》重写了所有魔法方法---》代理类---》23种设计模式的--->代理模式
print(LocalProxy对象)--》重写了__str__
print(LocalProxy对象.method)--->重写了__getattr__--->去当次请求的request中取出method
-单例模式
-工厂模式
-代理模式
2、flask-session(第三方)
pip install flask-session
from flask_session import RedisSessionInterface
from redis import Redis
conn = Redis(host='127.0.0.1', port=6379)
app.session_interface = RedisSessionInterface(conn, "session_")
from redis import Redis
from flask_session import Session
app.config['SESSION_TYPE'] = 'redis'
app.config['SESSION_REDIS'] = Redis(host='127.0.0.1', port='6379')
Session(app)
配置文件中 31天
配置文件配置,PERMANENT_SESSION_LIFETIME,有默认值
response.set_cookie('k','v',exipres=None)
app.session_interface=RedisSessionInterface(conn,key_prefix='lqz',permanent=False)
3、数据库连接池
-问题1 连接放在全局----》并发安全
-问题2 连接放在视图函数中---》连接数过多
-pip3 install dbutils
from dbutils.pooled_db import PooledDB
import pymysql
MYSQL_POOL = PooledDB(
creator=pymysql,
maxconnections=6,
mincached=2,
maxcached=5,
maxshared=3,
blocking=True,
maxusage=None,
setsession=[],
ping=0,
host='127.0.0.1',
port=3306,
user='root',
password='123',
database='lqz',
charset='utf8'
)
from pool import MYSQL_POOL
conn = MYSQL_POOL.connection()
cursor = conn.cursor()
4、信号
pip install blinker
request_started = _signals.signal('request-started')
request_finished = _signals.signal('request-finished')
before_render_template = _signals.signal('before-render-template')
template_rendered = _signals.signal('template-rendered')
got_request_exception = _signals.signal('got-request-exception')
request_tearing_down = _signals.signal('request-tearing-down')
appcontext_tearing_down = _signals.signal('appcontext-tearing-down')
appcontext_pushed = _signals.signal('appcontext-pushed')
appcontext_popped = _signals.signal('appcontext-popped')
message_flashed = _signals.signal('message-flashed')
记录日志,当用户访问home,记录日志---》好处是解耦
记录每一个请求的ip地址和客户端类型
def func1(*args, **kwargs):
print(args)
print(kwargs)
print("我是信号绑定的函数,我执行了")
before_render_template.connect(func1)
from flask.signals import _signals
lqz = _signals.signal('lqz')
def func1(*args, **kwargs):
print(args)
print(kwargs)
print("我是信号绑定的函数,我执行了")
lqz.connect(func1)
lqz.send()
5、flask-script
pip install flask-script
from flask import Flask, request, session, make_response, render_template
from flask_session import RedisSessionInterface
import pymysql
app = Flask(__name__)
from flask_script import Manager
manager = Manager(app)
app.secret_key = 'sss'
@manager.command
def custom(a, b):
print(a)
print(b)
@manager.option('-n', '--name', dest='name')
@manager.option('-u', '--url', dest='url')
def cmd(name, url):
"""
自定义命令(-n也可以写成--name)
执行: python manage.py cmd -n lqz -u www.liuqingzheng.top
执行: python manage.py cmd --name lqz --url www.liuqingzheng.top
"""
print(name, url)
@app.route('/')
def index():
return render_template('index.html')
if __name__ == '__main__':
manager.run()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!