Skip to content

Commit 476e36e

Browse files
author
guoyanfeng
committed
修复flask alchemy应用结束自动关闭session会出错的问题
Signed-off-by: guoyanfeng <guo.yanfeng@dataeveryday.com>
1 parent 8d7deb1 commit 476e36e

2 files changed

Lines changed: 10 additions & 3 deletions

File tree

CHANGES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#### Changed
99
- 修复fastapi alchemy中如果默认的连接失败ping操作也会失败的问题
1010
- 更改flask alchemy中如果ping操作默认key的类型值
11+
- 修复flask alchemy应用结束自动关闭session会出错的问题
1112

1213

1314
###[1.0.3b1~1.0.3b3] - 2020-12-8

fessql/dbalchemy/flask_alchemy.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
@software: PyCharm
77
@time: 18-12-25 下午4:58
88
"""
9-
9+
import threading
1010
from collections import MutableMapping, MutableSequence
1111
from contextlib import contextmanager
1212
from typing import Dict, Generator, List, Union
@@ -90,6 +90,7 @@ def __init__(self, app=None, *, username: str = "root", passwd: str = None, host
9090
self.dialect: str = dialect
9191
self.msg_zh: str = ""
9292
self.scoped_sessions: Dict[str, scoped_session] = {} # 主要保存其他scope session
93+
self.registry = threading.local() # 当前线程注册bind key
9394

9495
# 这里要用重写的BaseQuery, 根据BaseQuery的规则,Model中的query_class也需要重新指定为子类model,
9596
# 但是从Model的初始化看,如果Model的query_class为None的话还是会设置为和Query一致,符合要求
@@ -156,8 +157,8 @@ def init_app(self, app, username: str = None, passwd: str = None, host: str = No
156157

157158
@app.teardown_appcontext
158159
def _shutdown_other_session(response_or_exc):
159-
for _, session_ in self.scoped_sessions.items():
160-
session_.remove()
160+
for bind_key in getattr(self.registry, "bind_keys", set()):
161+
self.scoped_sessions[bind_key].remove()
161162
return response_or_exc
162163

163164
def get_engine(self, app=None, bind=None):
@@ -233,6 +234,10 @@ def gen_session(self, bind_key: str, session_options: Dict = None) -> Session:
233234
session = self.scoped_sessions[bind_key]()
234235
session.bind_key = bind_key # 设置bind key
235236
session = self.ping_session(session) # 校验重连,保证可用
237+
# 加入当前线程bindkey,用于自动关闭处理
238+
if hasattr(self.registry, "bind_keys") is False:
239+
self.registry.bind_keys = set()
240+
self.registry.bind_keys.add(bind_key)
236241

237242
return session
238243

@@ -449,6 +454,7 @@ class CustomBaseQuery(BaseQuery):
449454
目前是改造如果limit传递为0,则返回所有的数据,这样业务代码中就不用更改了
450455
"""
451456

457+
# noinspection DuplicatedCode
452458
def paginate(self, page: int = 1, per_page: int = 20, max_per_page: int = None,
453459
primary_order: bool = True) -> Pagination:
454460
"""Returns ``per_page`` items from page ``page``.

0 commit comments

Comments
 (0)