fix: apply monkey-patches at module level before any imports
This commit is contained in:
parent
dd028e2203
commit
9d3c65a056
69
app/pccs.py
69
app/pccs.py
@ -6,39 +6,46 @@ import os, sys
|
||||
|
||||
from ahserver.webapp import webapp
|
||||
|
||||
# ═══ 模块级 Monkey Patches (必须在任何 rbac/sqlor 使用前执行) ═══
|
||||
|
||||
# 1. DictObject.__getattr__ — 所有 ServerEnv 实例默认 get_module_dbname
|
||||
from appPublic.dictObject import DictObject
|
||||
|
||||
_orig_getattr = DictObject.__getattr__
|
||||
|
||||
|
||||
def _patched_getattr(self, key):
|
||||
if key == 'get_module_dbname':
|
||||
return lambda m: 'pccs'
|
||||
if key == 'password_encode':
|
||||
return lambda s: s
|
||||
return _orig_getattr(self, key)
|
||||
|
||||
|
||||
DictObject.__getattr__ = _patched_getattr
|
||||
|
||||
# 2. get_sor_context — 复用全局 DBPools 而非创建空实例
|
||||
from appPublic.jsonConfig import getConfig
|
||||
import sqlor.dbpools as _dbp
|
||||
from sqlor.dbpools import DBPools
|
||||
|
||||
config = getConfig()
|
||||
_global_db = DBPools(config.databases)
|
||||
|
||||
_orig_sor_ctx = _dbp.get_sor_context
|
||||
|
||||
|
||||
async def _patched_sor_ctx(env, modulename, errorback=None):
|
||||
dbname = env.get_module_dbname(modulename)
|
||||
async with _global_db.sqlorContext(dbname) as sor:
|
||||
yield sor
|
||||
|
||||
|
||||
_dbp.get_sor_context = _patched_sor_ctx
|
||||
_db_patched = True
|
||||
|
||||
|
||||
def init():
|
||||
# Monkey-patch DictObject.__getattr__ — 所有 ServerEnv 实例默认返回 'pccs'
|
||||
from appPublic.dictObject import DictObject
|
||||
|
||||
_orig = DictObject.__getattr__
|
||||
|
||||
def _patched(self, key):
|
||||
if key == 'get_module_dbname':
|
||||
return lambda m: 'pccs'
|
||||
if key == 'password_encode':
|
||||
return lambda s: s
|
||||
return _orig(self, key)
|
||||
|
||||
DictObject.__getattr__ = _patched
|
||||
|
||||
# Monkey-patch get_sor_context — 复用已初始化的 DBPools 而非创建空实例
|
||||
from appPublic.jsonConfig import getConfig
|
||||
import sqlor.dbpools as _dbp
|
||||
from sqlor.dbpools import DBPools
|
||||
|
||||
config = getConfig()
|
||||
_global_db = DBPools(config.databases)
|
||||
|
||||
_orig_sor_ctx = _dbp.get_sor_context
|
||||
|
||||
async def _patched_sor_ctx(env, modulename, errorback=None):
|
||||
dbname = env.get_module_dbname(modulename)
|
||||
async with _global_db.sqlorContext(dbname) as sor:
|
||||
yield sor
|
||||
|
||||
_dbp.get_sor_context = _patched_sor_ctx
|
||||
|
||||
from appbase.init import load_appbase
|
||||
from rbac.init import load_rbac
|
||||
load_appbase()
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user