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

时间:2015-02-07 19:26:42

标签: web2py

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

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

您可以提供的任何指导都会很棒。如果有一种方法来识别auth记录何时更改(以便我可以更新Mongo记录),那么这也是很好的但是次要要求。

提前致谢!

1 个答案:

答案 0 :(得分:2)

如果您开始使用脚手架应用程序,在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对象将传递给这些回调,插入/更新的值可以在form.vars中找到(form.vars.id是用户ID)。有关注册示例,请参阅this section of the docs

另一种选择是在db.auth_user表上设置_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功能),它也能正常工作。