如何实现基础的多用户?例如,让不同用户拥有各自独立的数据。

你可以通过 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_openon_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.')

用户还可以将上述方法与 认证 结合使用。