如何实现基础的多用户?例如,让不同用户拥有各自独立的数据。
你可以通过 Jam.py 实现多用户。
例如,如果某个数据项有一个 user_id 字段(类型为 INT),可以在该项的服务端模块中添加如下代码即可实现。前提是必须启用认证功能:
def on_open(item, params):
if item.session:
user_id = item.session['user_info']['user_id']
if user_id:
params['__filters'].append(['user_id', item.task.consts.FILTER_EQ, user_id])
def on_apply(item, delta, params, connection):
if item.session:
user_id = item.session['user_info']['user_id']
if user_id:
for d in delta:
if d.rec_inserted():
d.edit()
d.user_id.value = user_id
d.post()
elif d.rec_modified():
if d.user_id.old_value != user_id:
raise Exception('You are not allowed to change record.')
elif d.rec_deleted():
if d.user_id.old_value != user_id:
raise Exception('You are not allowed to delete record.')
上述代码,在 on_open 和 on_apply 事件处理程序中,利用了数据项的 session 属性来获取唯一的用户 ID。
on_open 事件处理程序确保应用程序生成的 SQL 查询只会返回 user_id 字段等于当前请求用户 ID 的记录。
on_apply 事件处理程序会将 user_id 设置为新增或修改记录的用户 ID。
你还可以采用更通用的方式,将如下代码添加到任务的服务端模块中。这样,所有包含 user_id 字段的数据项都会自动应用多用户逻辑:
def on_open(item, params):
if item.field_by_name('user_id'):
if item.session:
user_id = item.session['user_info']['user_id']
if user_id:
params['__filters'].append(['user_id', item.task.consts.FILTER_EQ, user_id])
def on_apply(item, delta, params, connection):
if item.field_by_name('user_id'):
if item.session:
user_id = item.session['user_info']['user_id']
if user_id:
for d in delta:
if d.rec_inserted():
d.edit()
d.user_id.value = user_id
d.post()
elif d.rec_modified():
if d.user_id.old_value != user_id:
raise Exception('You are not allowed to change record.')
elif d.rec_deleted():
if d.user_id.old_value != user_id:
raise Exception('You are not allowed to delete record.')
用户还可以将上述方法与 认证 结合使用。