我正在构建一个使用MongoDB作为主数据库的Web2py应用程序。为了简化身份验证,我坚持使用SQLite(最终是MySQL)进行成员管理。
当用户注册时,会在SQL数据库中创建一条记录。注册后,我希望在MongoDB中插入相同的记录。我可以轻松地编写查询以在Mongo中插入记录,但是我无法找到管理此过程的控制器(这样我就可以访问变量并将它们插入Mongo中)。
您可以提供的任何指导都会很棒。如果有一种方法来识别auth记录何时更改(以便我可以更新Mongo记录),那么这也是很好的但是次要要求。
提前致谢!
答案 0 :(得分:2)
如果您开始使用脚手架应用程序,在default.py
控制器中,您可能具有以下功能:
def user():
return dict(form=auth())
调用auth
对象处理所有Auth操作的处理(特定操作根据/ default / user之后的第一个URL arg确定 - 因此,/ default / user / register触发注册操作)。这里插入代码的问题是Auth通常配置为在注册后重定向,因此代码将不会被执行。
一种解决方案是设置Auth回调函数。 auth.settings.register_onaccept
和auth.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功能),它也能正常工作。