博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Flask/SQLAlchemy】关于session处理的一点经验
阅读量:6292 次
发布时间:2019-06-22

本文共 901 字,大约阅读时间需要 3 分钟。

在其他地方看到了这样一种处理方式

@self.app.before_requestdef init_session():    g.session = self.session_factory()@self.app.after_requestdef close_session(response):    g.session.close()    return response复制代码

这里的session_factory()

self.session_factory = scoped_session(sessionmaker(self.engine))复制代码

这样做的目的是在同一个线程能保证有唯一session,一方面是线程安全,一方面是避免出现重复申请session导致连接池满的问题。同时通过g访问session看起来方便。

初期实现确实很爽,但是跑了一阵就遇到了很多问题。最常见的就是session异常没有rollback导致请求失败。这个错误随机性很高,不好排查。

我因为这个问题质疑了好一阵Flask的实际能力,今天突然想通了,就是那个实现方式的锅。

下面是我的推测,没有经过实际验证

flask本身是单线程的,通过wsgi服务器可以搞成多进程运行提高性能。那么相当于在一个线程里面,所有逻辑都共用了一个session。如果只是单纯的接口,因为after_requests里面关闭了session,只要注意提交的时候捕获一下异常即可。

然而如果你的应用中在其他地方也在使用这个session,就很可能出问题了。

一些思路

如果你是纯Flask应用,不涉及任何视图函数之外的数据库逻辑,请直接使用flask-sqlalchemy。它封装的session默认是scoped_session。

如果还有很多外部代码,一定保证你的session是可控的。 简单来说就是:

  • 用就开,用完就关
  • 尽量避免多个函数依赖之间同时使用session
  • 使用scoped_session来保证线程安全

转载于:https://juejin.im/post/5cd4f317f265da03b91833de

你可能感兴趣的文章
Flutter之基础Widget
查看>>
写给0-3岁产品经理的12封信(第08篇)——产品运营能力
查看>>
ArcGIS Engine 符号自动化配置工具实现
查看>>
小程序 · 跳转带参数写法,兼容url的出错
查看>>
flutter error
查看>>
Flask框架从入门到精通之模型数据库配置(十一)
查看>>
10年重新出发
查看>>
2019年-年终总结
查看>>
聊聊elasticsearch的RoutingService
查看>>
让人抓头的Java并发(一) 轻松认识多线程
查看>>
从源码剖析useState的执行过程
查看>>
地包天如何矫正?
查看>>
中间件
查看>>
Android SharedPreferences
查看>>
css面试题
查看>>
Vue组建通信
查看>>
用CSS画一个带阴影的三角形
查看>>
前端Vue:函数式组件
查看>>
程鑫峰:1.26特朗.普力挺美元力挽狂澜,伦敦金行情分析
查看>>
safari下video标签无法播放视频的问题
查看>>