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- 在 角色 中定义的莫格角色的 IDrole_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':
.
.