@@ -35,30 +35,47 @@ fba 通过 JWT 中间件将用户信息存储到了每个请求的上下文中
3535
3636### 手动
3737
38- 首先,在接口函数中,像 Django/Flask 一样, 传入一个 ` request ` 参数,最好,我们加上参数类型:` request: Request `
39- ,然后我们可以在接口函数中通过 ` request.user.id ` 获取当前操作人员 id ,这样,在存储的时候,就可以传递此 id 进行存储
38+ 首先,在接口函数中,传入一个 ` request ` 参数,最好,我们加上参数类型:` request: Request ` ,然后我们可以在接口函数中通过
39+ ` request.user.id ` 获取当前操作人员 id ,然后传递此 id 进行存储
4040
41- 除此之外,我们还可以通过 ` ctx.user_id ` 更便捷的获取操作人员 id,尽情享受吧
41+ 除此之外,为了简化代码, 我们还可以通过 ` ctx.user_id ` 直接获取操作人员 id 进行存储
4242
4343### 自动
4444
4545利用 SQLAlchemy 的事件监听,我们可以轻松做到这一点
4646
47+ 首先,我们需要对 UserMixin 做些调整:
48+
49+ ``` python{4}
50+ class UserMixin(MappedAsDataclass):
51+ """用户 Mixin 数据类"""
52+
53+ created_by: Mapped[int] = mapped_column(init=False, sort_order=998, comment='创建者')
54+ updated_by: Mapped[int | None] = mapped_column(init=False, default=None, sort_order=998, comment='修改者')
55+ ```
56+
57+ 然后在 ` backend/common/model.py ` 底部添加添加以下监听事件:
58+
4759``` python
4860@event.listens_for (UserMixin, ' before_insert' , propagate = True )
4961def set_created_by (mapper , connection , target ) -> None : # noqa: ANN001
5062 if hasattr (target, ' created_by' ):
5163 target.created_by = ctx.user_id
5264
5365
54- @event.listens_for (UserMixin, ' before_update' , propagate = True )
55- def set_updated_by (mapper , connection , target ) -> None : # noqa: ANN001
56- if hasattr (target, ' updated_by' ):
57- target.created_by = ctx.user_id
66+ @event.listens_for (Session, ' do_orm_execute' , propagate = True )
67+ def set_updated_by (orm_statement : ORMExecuteState) -> None :
68+ if (
69+ orm_statement.is_update
70+ and orm_statement.is_orm_statement
71+ and orm_statement.statement.is_update
72+ and orm_statement.bind_mapper.c.get(' updated_by' ) is not None
73+ ):
74+ orm_statement.statement = orm_statement.statement.values(updated_by = ctx.user_id)
5875```
5976
6077::: warning
61- 只有特定方法才会进行监听,详情请查看 :[ sqlalchemy #12724 ] ( https://github.com/sqlalchemy/sqlalchemy/discussions/12724 )
78+ 事件监听条件要求严格,如果监听事件未按预期执行,参考 :[ sqlalchemy #12724 ] ( https://github.com/sqlalchemy/sqlalchemy/discussions/12724 )
6279:::
6380
6481## 如何展示?
0 commit comments