certflow.controllers.base_controller module¶
控制器基类
提供所有业务控制器的基类实现,封装数据库会话管理、事务处理等通用功能.
- class certflow.controllers.base_controller.BaseController(db_session=None, db_manager=None, use_shared=True)[源代码]¶
基类:
object控制器基类
所有业务控制器的基类,提供统一的数据库会话管理和事务处理方法. 支持上下文管理器协议,可自动管理会话生命周期. 支持共享数据库管理器,实现全局WebDAV配置统一管理.
- 参数:
db_session (Session | None)
db_manager (DatabaseManager | None)
use_shared (bool)
- db_manager¶
数据库管理器实例,负责创建和管理数据库连接
- session¶
SQLAlchemy数据库会话对象,用于执行数据库操作
- _owns_session¶
是否拥有会话的所有权,决定close()时是否关闭会话
示例
>>> # 方式1: 使用上下文管理器(推荐) >>> with BaseController() as controller: ... result = controller.session.query(User).all() ... controller.commit() >>> >>> # 方式2: 手动管理会话 >>> controller = BaseController() >>> try: ... result = controller.session.query(User).all() ... controller.commit() ... finally: ... controller.close() >>> >>> # 方式3: 共享数据库管理器(支持WebDAV) >>> db_manager = DatabaseManager(webdav_config=config) >>> controller = BaseController(db_manager=db_manager) >>> >>> # 方式4: 使用全局共享管理器 >>> BaseController.set_shared_db_manager(db_manager) >>> controller = BaseController() # 自动使用共享管理器
设置共享的数据库管理器(用于全局WebDAV配置)
设置后,所有新创建的控制器如果没有显式传入db_manager, 都会使用这个共享实例。
- 参数:
db_manager (DatabaseManager) -- 共享的数据库管理器实例
- 返回:
None
- 返回类型:
None
示例
>>> # 在应用启动时设置 >>> db_manager = DatabaseManager(webdav_config=config) >>> BaseController.set_shared_db_manager(db_manager)
获取共享的数据库管理器
- 返回:
共享的数据库管理器实例,如果未设置则返回None
- 返回类型:
DatabaseManager | None
清除共享的数据库管理器
将类级别的共享管理器置空,后续控制器将回退到独立管理器。
- 返回:
None
- 返回类型:
None
- __enter__()[源代码]¶
上下文管理器入口
支持with语句,返回控制器实例自身.
- 返回:
控制器实例自身
- 返回类型:
示例
>>> with BaseController() as controller: ... # 使用controller进行操作 ... pass
- __exit__(exc_type, exc_val, exc_tb)[源代码]¶
上下文管理器出口
退出with代码块时自动关闭数据库会话.
- 参数:
exc_type (type[BaseException] | None) -- 异常类型,如果发生异常则为异常类
exc_val (BaseException | None) -- 异常实例,如果发生异常则为异常对象
exc_tb (TracebackType | None) -- 异常追踪信息,如果发生异常则为traceback对象
- 返回:
None
- 返回类型:
None
- commit()[源代码]¶
提交数据库事务
提交当前会话中的所有更改.如果提交过程中发生异常, 会自动回滚事务并重新抛出异常.
- 返回:
None
- 抛出:
Exception -- 事务提交失败时抛出原始异常
- 返回类型:
None
- get_service(service_cls, *args, **kwargs)[源代码]¶
以当前控制器会话构造一个 Service 实例(收口 Service 构造来源)
统一替代
XxxService(self.session)的散落写法:session 来源经BaseController收口,调用方不直接触碰self.session。仅适用于构造签名首个位置参数为
Session的 Service;首个参数非 会话的 Service(如PrinterService(printer_name))不应走此工厂。