请求上下文源码简单分析、flask-session使用、数据库连接池、信号、flask-script使用
2022-05-17 16:10
836 查看
今日内容概要
- 请求上下文简单分析
- flask-session(第三方)
- 数据库连接池
- 信号
- flask-script
内容详细
1、请求上下文简单分析
# flask 1.0带你看的源码 # flask的请求上下文-->整个执行过程中有个context对象---》整个贯串了一次请求 # 1 当请求来的时候,把当次请求的请求对象request,放到local对象中,每个请求都是一个线程在执行 -假设同时来了3个请求,都在执行index视图函数---》3条线程在执行index -三条线程分别放到local中,只要在当前线程中,再去local中取,取出来的就是当前线程的request # 2 视图函数中 -使用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 # 3 请求走了,它要把request对象从local上移除 # 4 request,session,g 都是全局 # 5 本质源码中 【request,session】---》放到了ctx对象中--》RequestContext对象--》ctx放到了local上 【g,current_app】-->app_ctx-->APPRequest对象 # 6 请求上下文,应用上下文 # 请求来了--》http请求---》符合wsgi协议的web服务器(负责拆分http请求,保装成python对象--》environ, start_response)---》框架(django,flask)--》以后需来一个请求,wsgi服务器就起一个线程---》运行可调用对象加括号---》可调用对象在flask中是 app对象,在django application对象--》对象()---》触发对象的__all__方法---》 # flask--->app对象--》__all__是一个请求来了的入口---> # 23种设计模式---》架构设计--》封装框架---》大量采用设计模式 -单例模式 -工厂模式 -代理模式 # 解释了为什么flask中的request是全局对象,而且在不同视图函数中用,没有乱,用的是自己的
2、flask-session(第三方)
# 缓存到redis,文件 # 安装: pip install flask-session # 本质就是重写了 open_session和save_session # 方式一:替换app的session_interface--->RedisSessionInterface重写了open_session和save_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_") # 使用方式二:常用的 # 方式二:通过某个类(app)形式 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) # 本质原理跟上面一样,替换了app的session_interface---》更通用--》以后使用flask会经常看到 # 某个类(app) # 1 设置session过期时间 # cookie默认超时时间是多少?如何设置超时时间 配置文件中 31天 # session过期时间呢? 配置文件配置,PERMANENT_SESSION_LIFETIME,有默认值 # 2 设置cookie时,如何设定关闭浏览器则cookie失效 # 如果exipres=None,表示关闭浏览器就失效 response.set_cookie('k','v',exipres=None)#这样设置即可 # 在session中设置---》关闭浏览器---》让cookie失效---》只要失效,下次发请求,就不会带来了--》session就没用了 app.session_interface=RedisSessionInterface(conn,key_prefix='lqz',permanent=False)
3、数据库连接池
# flask 项目---》使用pymysql操作数据库 # 直接使用pymysql会存在的问题 -问题1 连接放在全局----》并发安全 -问题2 连接放在视图函数中---》连接数过多 # 连接池解决 -pip3 install dbutils # 新建一个py文件 pool.py from dbutils.pooled_db import PooledDB import pymysql MYSQL_POOL = PooledDB( creator=pymysql, # 使用链接数据库的模块 maxconnections=6, # 连接池允许的最大连接数,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='123', database='lqz', charset='utf8' ) # 在视图函数中使用(只要涉及到多线程,尽量使用池) from pool import MYSQL_POOL conn = MYSQL_POOL.connection() cursor = conn.cursor() # uwsgi是 进程(4个)+线程模型(开了很多线程)---》4*线程数---》如果io多,性能没有充分利用 # uwsgi+gevent:进程+线程+协程部署方案 # qps:1s内能处理请求数
4、信号
# 信号--》signal---》flask,django # Flask框架中的信号基于blinker,其主要就是让开发者可是在flask请求过程中定制一些用户行为 # 整个flask执行过程中,留了一些钩子,可以给钩子绑定函数,一旦绑定了,执行到这,就会执行这个函数 # 安装 pip install blinker # 内置信号(flask有,django也有) 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') # 应用上下文push时执行 appcontext_popped = _signals.signal('appcontext-popped') # 应用上下文pop时执行 message_flashed = _signals.signal('message-flashed') # 调用flask在其中添加数据时,自动触发 ####### 信号的使用 # 信号能干啥: 记录日志,当用户访问home,记录日志---》好处是解耦 记录每一个请求的ip地址和客户端类型 # django中,只要在user表插入一条数据,我就干个xx事---》双写一致性更新缓存 ## 内置信号的使用步骤 # 信号使用步骤 # 第一步:定义信号(内置的已经定义好了) # 第二步:给信号绑定函数(咱们做) 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
# django 可以通过python manage.py runserver 命令来完成一些操作,启动程序,迁移数据 # flask不支持--》借助第三方,让它支持---(flask最终变成了djagno) # 安装 pip install flask-script # django中自定义命令
from flask import Flask, request, session, make_response, render_template from flask_session import RedisSessionInterface import pymysql app = Flask(__name__) # 第一步:导入,把app用一个类包一下 from flask_script import Manager manager = Manager(app) app.secret_key = 'sss' # django也可以---》自行百度---》项目测试,数据导入--》命令--》自动导入测试数据 # python manage.py inportexcel user 路径/a.xsl # 自定制命令 python manage.py db init 初始化数据库 ### 方式一 @manager.command # python manage.py custom 3 4 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__': # app.run() # 第二步: manager.run()
相关文章推荐
- Flask请求上下文源码讲解,简单的群聊单聊web
- Flask框架(flask中的请求上下文和应用上下文,以及请求钩子的使用,Flask-Script 扩展命令行)
- 如何使用androidpn实现android手机消息推送(简单的源码分析)
- Google Mock(Gmock)简单使用和源码分析——简单使用
- ki4so 使用原始凭证(表单提交)登录成功后的加密和下次请求的解密 源码分析
- 01 flask-script模块简单使用介绍
- Volley简单学习使用五—— 源码分析三
- flask之源码解读RequestContext(请求上下文)执行流程
- Flask源码解读 <2> --- 请求上下文和request对象
- android Retrofit简单使用及源码分析
- 如何使用androidpn实现android手机消息推送(简单的源码分析)
- Rome使用简单说明二(部分关键源码分析)
- Google Mock(Gmock)简单使用和源码分析——源码分析
- 如何使用androidpn实现android手机消息推送(简单的源码分析)
- Lottie源码简单分析以及使用
- SpringMVC 中文件上传 MultipartResolver两种使用方式及简单源码分析
- flask使用session保存登录状态及拦截未登录请求代码
- SpringMVC4.x源码分析(七):使用XStream处理xml请求和响应消息实战
- okhttp框架源码分析从同步&异步请求使用开始
- tabhost简单使用及tabhost源码分析