摘要: Flask , flask-sqlalchemy , SQL
flask-sqlalchemy 可以记录下在客户端请求应用的过程中,后台涉及的SQL语句,以及SQL语句执行的时长,主要基于flask-sqlalchemy下的 get_debug_queries 实现。在主视图脚本中加入一个 after_request 视图如下。
其中开启SQL Debug模式 app.config['SQLALCHEMY_RECORD_QUERIES'] = True , get_debug_queries 返回请求涉及的所有SQL语句,调用 duration 获得SQL执行时长,只要大于0.2就用logging模块记录到磁盘。
启动程序,点击应用功能,logging会把大于时间阈值的SQL写入本地文件query_log.log
直接搜索Slow query,得到以下几条记录
三张表pira_ent_alias,pira_score,pira_senti_stats都是简单的filter查询,没有复杂的逻辑,查看MySQL explain执行计划
explain结果解析
增加索引
三张表都进行了全表扫描,先加上索引再说,给pira_ent_alias增加ent_name和ent_shortname的普通索引
给pira_score,pira_senti_stats增加ent_name和datetime的复合索引,复合索引从字段组合的 最左边开始就要走 ,否则无效,因此如果filter条件只有datetime还是全表扫描,filter条件是ent_name或者ent_name和datetime有效。
给三张表增加索引之后,再次运行get_debug_queries,阈值降低为0,查看日志如下,执行时间都有很大降低
其实源码分析很难写好,关键要自己去阅读先写一个测试程序
ctrl+左键点击进request源码
可以看到request是_request_ctx_stack.top的一个request属性。同时,_request_ctx_stack是一个全局对象。
那么什么时候会产生_request_ctx_stack.top对象呢,在处理请求前会构造并且赋值进去。
在RequestContext的push方法,有
此语句将RequestContextpush进_request_ctx_stack,这个语句所在的push函数会在处理请求前会构造并且赋值进去。
每一次ajax请求都建立新的tcp连接,flask dev版本的server是HTTP1.0。但是chrome并不会说只建立一个tcp连接,网上有人说一个网站最多会同时建立6个连接。
使用nginx的时候可以看到复用了连接
那么如果用独角兽和nginx一起部署,nginx代理本地独角兽端口,是不是nginx和Gunicorn之间是什么连接?性能上来说是做成长连接, 具体是怎么处理的还得看nginx和Gunicorn的实现。Flask只做了wsgi_app(),是在多进程还是多线程下执行的Flask由Gunicorn决定。每个进程之间数据隔离,线程共享数据,而Flask的经典设计,把请求上下文和当前请求线程关联(没有多线程那就是main线程),每一个线程的请求上下文放到stack里面,那么如果复用http请求的话,是不是会造成阻塞?
从Flask dev的server来看,里面使用的是tcpserver模块,这个是python内置模块,同时默认,flask的server是多线程的,每一个tcp请求都会在子线程处理
在BaseServer里面可以看到处理请求
get_request方法就是返回一个socket连接
具体的process_request是由ThreadingMixIn实现,
每一次请求完就shutdown_request, 并没有复用。如果需要复用,需要保存连接请求放在连接池,浏览器也不要关闭连接,服务端也不要关闭,继续监听这个tcp连接是否有数据接收,有就读取出来处理。
finish_request会创建BaseRequestHandler对象。
BaseRequestHandler里面会调用子类的handle方法
在flask更新到1.0之后的版本,官方推荐使用flask run的方式运行程序,可是作为开发,如果没有了pycharm的断点调试,这可太难受了。所以,本篇博客主要讲述如何在pycharm中运行flask程序,并开启Debug模式。
首先你的使用pycharm创建你的第一个app。
然后,你会有一个基本的应用程序了。没错就是那个hello world。
接下来我们开始配置pycharm。
点击红色下拉框,选择“Edit Configurations”会d出一个配置窗口。
下图的配置窗口你需要注意三个地方。我在图中依次标注了出来。
这是我的应用的名字,这个名字是使用pycharm创建项目时根据项目名字自动生成,我们无需关系,但是要确定这个一个flask server就OK。
如果你创建项目的时候没有选择flask,这里不会出现这个flask server。
这里需要指定项目要运行的脚本,你可以理解为是整个项目的一个入口。
点击右侧的文件夹,找到你的刚才创建的应用程序所在的目录,并选择哪个app.py文件就行。
这里需要指定两个环境变量(分别是LC_ALL和LANG),否则pycharm会报错。
点击右侧的按钮会d出一个配置环境变量的列表,点击“+”添加环境变量,分别加上LC_ALL和LANG。
我们可以在项目的根目录,添加一个叫.flaskenv的文件。
其中写上如下内容:
然后打开pycharm的终端窗口。执行flask run即可。
写到这里我忍不住吐槽两句,原本简单粗暴的框架,非得整这些花里胡哨的玩意,java为什么市场占有率那么高?
我个人认为就是很多事情框架都帮你做好了,开发懂个屁啊,你让他配置?他能把语法写明白就不错了!!我呸!!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)