Web2Py在后端处理身份验证表单

时间:2016-03-26 07:07:29

标签: python authentication web2py

数据库模型结构如下所示。

我想向用户提交一份要求提供hostel_name的注册表单,然后在后端转换hostel_name以根据旅馆ID存储它。

控制器/ default.py

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

模型/ db.py

db.define_table(
    'hostels',
    Field('hostel_admin_group_id', 'integer'),
    Field('hostel_residents_group_id', 'integer'),
    Field('hostel_name', length=32, unique=True),
 )


db.define_table(
    'users',
    Field('username', length=32, unique=True),
    Field('password', 'password', length=32, readable=False, label='Password'),
    Field('first_name', 'string', length=32, default=''),
    Field('last_name', 'string', length=32, default=''),
    Field('email_id', 'string', length=32),
    Field('degree_name', 'string', length=32),
    Field('hostel_id', db.hostels),
    Field('picture_id', 'integer'),
    Field('year_of_degree', 'integer'),
 )

视图/ user.html

{{extend 'layout.html'}}

<h2>
{{=T('Sign Up') if request.args(0) == 'register' else T('Log In') if request.args(0) == 'login' else T(request.args(0).replace('_',' ').title())}}
</h2>

<div class="container">
    <div class="row">
        <div id="web2py_user_form" class="col-lg-6">
        {{
        if request.args(0)=='login':
            if not 'register' in auth.settings.actions_disabled:
                form.add_button(T('Sign Up'),URL(args='register', vars={'_next': request.vars._next} if request.vars._next else None),_class='btn btn-default')
            pass
            if not 'request_reset_password' in auth.settings.actions_disabled:
                form.add_button(T('Lost Password'),URL(args='request_reset_password'),_class='btn btn-default')
            pass
        pass
        =form
        }}
        </div>
    </div>
</div>


{{block page_js}}
<script>
    jQuery("#web2py_user_form input:visible:enabled:first").focus();
{{if request.args(0)=='register':}}
    web2py_validate_entropy(jQuery('#auth_user_password'),100);
{{elif request.args(0)=='change_password':}}
    web2py_validate_entropy(jQuery('#no_table_new_password'),100);
{{pass}}
</script>
{{end page_js}}

上面的代码向用户提供注册表格,并希望用户输入旅馆ID。我需要更改什么才能启用此功能?

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您可以为IS_IN_DB字段明确定义hostel_id验证程序,提供label参数以指定要在HTML选择窗口小部件中使用的标签:

    Field('hostel_id', db.hostels,
          requires=IS_IN_DB(db, 'hostels.id', label='%(hostel_name)s'),
          represent=lambda ref, row: ref.hostel_name)

IS_IN_DB验证程序将导致SQLFORM为该字段生成一个选择窗口小部件,其label参数将导致hostel_name字段用于生成标签即使实际的db.hostels.id值将插入数据库中,也可以使用小部件。

represent属性指定值如何以只读形式和网格显示。

注意,所有上述(requiresrepresent属性)都可以更简单地实现,只需在定义format表时指定db.hostels参数:

db.define_table(
    'hostels',
    Field('hostel_admin_group_id', 'integer'),
    Field('hostel_residents_group_id', 'integer'),
    Field('hostel_name', length=32, unique=True),
    format='%(hostel_name)s')

使用上述format参数,引用db.hostels的所有表格都会自动获得IS_IN_DB验证码和represent属性,如上所示。

最后,如果您打算使用web2py Auth系统,而不是创建自己的users表,则应该只是扩展或重新定义标准db.auth_user表。这是here的解释。另外,出于安全考虑,您不应将密码存储为纯文本 - 因此您应该使用带有密码字段的CRYPT验证器(标准db.auth_user表自动执行此操作)。