我是web2py的新手。我想创建一个有一个管理员的应用程序(超级用户) 帐户。我想限制'只有管理员可以注册用户'。以便 一旦管理员登录到应用程序,他将看到不同的菜单,如'Home', '设置'和'注册用户'。我完成了其他选择,但我 在“注册用户”中遇到问题。
在我的应用程序中有一个“注册”链接 - http://127.0.0.1:8000/filemanager2/default/user/register。但是当我点击它时,我明白了 重定向到配置文件页面。这是因为管理员用户已经登录了 in并因此在点击注册链接后显示管理员 帐户的个人资料。我该怎么做才能解决这个问题?
答案 0 :(得分:6)
如果你想利用内置的Auth register()函数,你可以按照以下方式破解它:
@auth.requires_membership('admin')
def register()
admin_auth = session.auth
auth.is_logged_in = lambda: False
def post_register(form):
session.auth = admin_auth
auth.user = session.auth.user
auth.settings.register_onaccept = post_register
return dict(form=auth.register())
通常,Auth.register()会检查用户是否已登录,如果是,则重定向到配置文件页面。上面用一个简单返回False的lambda替换auth.is_logged_in()方法,因此不会发生重定向。 Auth.register()还将session.auth和auth.user设置为与新注册用户关联的值,因此上面的代码保存了admin的值,并使用register_onaccept回调将session.auth和auth.user恢复为admin的值。
另一种方法是简单地基于db.auth_user表创建自己的注册表单,并使用Auth.get_or_create_user()方法添加新用户:
@auth.requires_membership('admin')
def register():
form = SQLFORM(db.auth_user)
if form.validate():
admin_user = auth.user
auth.get_or_create_user(form.vars)
auth.user = admin_user
return dict(form=form)
但是,在这种情况下,您将无法获得内置register()函数自动添加到注册表单的密码验证字段。与内置的register()方法一样,get_or_create_user()也将auth.user设置为新用户的记录,因此在插入后必须将其重新设置回admin用户的记录。
注意,上述两种方法都会自动为新用户创建一个新的唯一Auth组,如果auth.settings.create_user_groups为True(这是默认值),则将用户分配给该组。您可以简单地使用标准SQLFORM添加新用户,而不是上述方法,但您必须手动创建和添加组。
我们应该添加一个选项,以使这更容易。