From 9d3c65a056bbb2095c34329e299fe09a596d1135 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Tue, 11 Aug 2026 16:57:13 +0800 Subject: [PATCH] fix: apply monkey-patches at module level before any imports --- app/pccs.py | 69 +++++++++++++++++++++++++++++------------------------ 1 file changed, 38 insertions(+), 31 deletions(-) diff --git a/app/pccs.py b/app/pccs.py index d011fd2..3cbdbcb 100644 --- a/app/pccs.py +++ b/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()