on_login

on_login(task, form_data, info)

使用范围: server

编程语言: python

父类: Task 类

描述说明

通过应用程序构建器的 “用户表(Users table)”, 使用 on_login 事件重写默认的登录过程,

task 参数是指向 task 树 的一个引用。

form_data 是一个字典,里面包含用户在登录表单窗体的输入框里输入的数据。 字典的 “键” 是输入框的 name 属性值。

info 参数一个字典,它有下列属性:

  • ip 是请求的 ip 地址。

  • session_uuid 是将被创建的会话的唯一标识符(uuid)。

该事件处理程序必须返回有下列属性的字典:

  • user_id - 用户的唯一表示

  • user_name - 用户名

  • role_id - 在 角色 中定义的莫格角色的 ID

  • role_name - 角色名

作为模板的登录表单窗体位于在 Jam.py 的 login.html 文件中。 你能添加你自己定义的含有输入框的文件,并用 form_data 参数获取它们的值。

在项目文件夹里的自定义 login.html 会覆盖默认的登录模板文件。

<form action="" method="post">
    <div class="modal-body">
        <div class="my-1 mx-4 row">
            <label for="login" class="col-sm-3 col-form-label">%(login_text)s</label>
            <div class="col-sm-9">
                <input type="text" class="form-control" name="login" id="login" placeholder="%(login_text)s" value="%(login)s" required>
            </div>
        </div>

        <div class="my-1 mx-4 row">
            <label for="password" class="col-sm-3 col-form-label">%(password_text)s</label>
            <div class="col-sm-9">
            <div class="input-group">
                <input type="password" class="form-control" name="password" id="password" placeholder="%(password_text)s" value="%(password)s">
                <button class="btn btn-outline" type="button" id="togglePassword">
                    <i class="bi bi-eye-fill"></i>
                </button>
            </div>
            </div>
        </div>
    </div>
    <div class="modal-footer">
        <input class="btn btn-primary px-4" type="submit" value="OK">
    </div>
</form>

示例

在此示例中,用户信息存储在项目数据库中的 Users 实体项对应的表中:

def on_login(task, form_data, info):
    users = task.users.copy(handlers=False)
    users.set_where(login=form_data['login'])
    users.open()
    if users.rec_count == 1:
        if task.check_password_hash(users.password_hash.value, form_data['password']):
            return {
                'user_id': users.id.value,
                'user_name': users.name.value,
                'role_id': users.role.value,
                'role_name': users.role.display_text
            }

添加 “重置按钮”

要创建一个重置密码选项,像下面那样创建一个自定义的 login.html 文件,增加一个自定义的 reset_pass.html 文件,并开发 on_ext_request 事件逻辑和 on_request 路由:

<div class="modal-footer">
    <a href="/reset_pass.html" class="button" target="_blank">Forgotten password?</a>
    <button class="btn btn-lg btn-primary w-100 mt-3" type="submit">Login</button>
</div>
def on_request(task, request):
    parts = request.path.strip('/').split('/')
    if not parts[0]:
        if task.logged_in(request):
            return task.serve_page('index.html')
        else:
            return task.redirect('/login.html')
    .
    .
    elif parts[0] == 'reset_pass.html':
        return task.serve_page('reset_pass.html')

def on_ext_request(task, request, params):
    reqs = request.split('/')

    #reset password
    if reqs[2] == 'reset_pass':
    .
    .

另请参见

session

environ

generate_password_hash

check_password_hash