Web2py - 自定义注册和登录表单合二为一

Web2py - Custom Registration & Login Form in One

我想允许用户从一个表单注册和登录。

表单只需要一个电子邮件地址和一个密码。如果用户输入不存在的电子邮件地址,我想使用提供的电子邮件地址和密码组合注册用户。否则,该表单将像标准登录表单一样运行。

型号(禁用first_name、last_name和密码验证):

auth.settings.register_verify_password = False
db.auth_user.first_name.writable = False
db.auth_user.last_name.writable = False

controller(不确定在这里做什么):

def index():
    //maybe submit vars to login() first, then if user does not exist submit vars to register()????

    return dict(form=auth.login(),form1=auth.register())

view.html(自定义格式):

           <form method="POST">
                          <div class="form-group">
                              <input type="text" class="form-control" id="auth_user_email" name="email">
                          </div>
                          <div class="form-group">
                              <input type="password" class="form-control" id="auth_user_password" name="password">
                          </div>
                          <button type="submit">Go</button>
            {{=form.custom.end}} 

在 Web2py 中完成此任务的最佳方法是什么?

In your controller, auth.login_bare is the trick:

email, password = request.post_vars['email'], request.post_vars['password']
if not auth.login_bare(email, password):
     db.auth_user.insert(
          first_name=None,
          last_name=None,
          email=email,
          password=db.auth_user.password.requires[0](password)[0]
     )
     auth.login_bare(email, password)
#redirect

注意,如果用户名和密码存在,auth.login_bare 将自动登录用户。如果组合不存在,那么我们手动将用户插入数据库。

仅供参考,您可能应该在将用户插入数据库之前验证电子邮件,但为简单起见,我将其省略。

In your view, a simple or custom form will do:

<form enctype="multipart/form-data"
  action="{{=URL()}}" method="post"> <!--{{#or use =form.custom.begin}}-->
     <div class="form-group">
          <input type="text" class="form-control" name="email">
     </div>
     <div class="form-group">
          <input type="password" class="form-control" name="password">
     </div>
     <button type="submit">
           Submit
     </button>
</form> <!--{{#or use =form.custom.end}}-->