Web2py - 在注册的第二个表中插入记录

Web2py - Insert Record in Second Tabel on Registration

我正在构建一个使用 MongoDB 作为其主要数据库的 Web2py 应用程序。为了简化身份验证,我坚持使用 SQLite(最终 MySQL)进行成员管理。

当用户注册时,会在 SQL 数据库中创建一条记录。注册后,我希望在 MongoDB 中插入相同的记录。我可以轻松编写查询以在 Mongo 中插入记录,但我找不到管理此过程的控制器(以便我可以访问变量并将它们插入 Mongo)。

如果您能提供任何指导,那就太好了。如果有一种方法可以识别身份验证记录何时更改(以便我可以更新 Mongo 记录),那也很好,但这是次要要求。

提前致谢!

如果您从脚手架应用程序开始,在 default.py 控制器中,您可能有这样的功能:

def user():
    return dict(form=auth())

调用 auth 对象处理所有 Auth 操作的处理(特定操作是根据 /default/user 之后的第一个 URL arg 确定的——因此,/default/user /register 触发注册操作)。这里插入代码的问题是Auth通常配置为注册后重定向,所以代码不会被执行。

一种解决方案是设置 Auth 回调函数。 auth.settings.register_onacceptauth.settings.profile_onaccept 是在成功注册或个人资料更新后调用的回调列表。关联的 Auth form 对象被传递给这些回调,inserted/updated 值可以在 form.vars 中找到(form.vars.id 是用户 ID)。有关注册示例,请参阅 this section of the docs

另一种选择是在 db.auth_user table 上设置 _after_insert and _after_update callbacks。假设 MongoDB DAL 对象称为 mongo 并且 db.auth_user.id 存储在名为 user_id:

的字段中
def copy_user(fields, id):
    fields.update(user_id=id)
    mongo.auth_user.insert(**fields)

def update_user(dal_set, fields):
    id = dal_set.select(db.auth_user.id)[0].id
    mongo(mongo.auth_user.user_id == id).update(**fields)

db.auth_user._after_insert.append(copy_user)
db.auth_user._after_update.append(update_user)

这种方法的优点是,即使记录在 Auth 系统之外更新(例如,通过 appadmin 功能),它也能正常工作。