news 2026/10/13 9:51:13

lakeFS Python SDK 中的 User 模型:字段语义、序列化用法与用户管理实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
lakeFS Python SDK 中的 User 模型:字段语义、序列化用法与用户管理实战
  • 数据工程
  • 数据湖
  • 大数据
  • 对象存储
  • 后端

【免费下载链接】lakeFS

lakeFS - Data version control for your data lake | Git for data

项目地址:https://gitcode.com/gh_mirrors/la/lakeFS
点击查看免费下载

导读

本文以 lakeFS 官方 Python SDK(lakefs_sdk)中的User数据模型为核心,完整解析该模型的id、creation_date、friendly_name、email四个字段的定义、约束与适用场景,并通过from_json/to_json/to_dict/from_dict等完整示例展示 JSON 与 Python 对象的互转方式。同时结合 api/swagger.yml 中/auth/users系列 REST 接口、SDK 中的 auth_api.py 实现以及服务端 pkg/auth/basic_service.go 的底层逻辑,带你掌握"模型字段 + API 调用 + 用户生命周期管理"的完整链路,能够在 Python 项目中直接落地用户创建、查询、列出与删除。

User 模型字段全解析

User模型在 SDK 中定义于 clients/python/lakefs_sdk/models/user.py,由 OpenAPI Generator 依据 api/swagger.yml 中的Userschema(见 api/swagger.yml#L900-L923)自动生成。其类型定义如下:

class User(BaseModel): id: StrictStr = Field(..., description="A unique identifier for the user. Cannot be edited.") creation_date: StrictInt = Field(..., description="Unix Epoch in seconds") friendly_name: Optional[StrictStr] = Field(None, description="A shorter name for the user than the id. Unlike id it does not identify the user (it might not be unique). Used in some places in the UI. ") email: Optional[StrictStr] = Field(None, description="The email address of the user. If API authentication is enabled, this field is mandatory and will be invited to login. If API authentication is disabled, this field will be ignored. All current APIAuthenticators require the email to be lowercase and unique, although custom authenticators may not enforce this. ")

四个字段的完整语义对照如下:

字段类型必填说明
idstr是用户的唯一标识符(Unique identifier),创建后不可修改(Cannot be edited)。
creation_dateint是用户创建时间,以Unix Epoch 秒为单位(Unix Epoch in seconds)。
friendly_namestr否比id更短的用户显示名。与id不同,它不唯一、不能用于身份识别,仅用于 UI 等展示场景。
emailstr否用户邮箱地址。启用 API 认证时该字段为必填,且会被邀请登录;禁用 API 认证时该字段被忽略。当前所有 APIAuthenticators 都要求邮箱小写且唯一(自定义 authenticator 可能不强制)。

服务端的字段映射

User模型并非 SDK 独有,服务端 pkg/auth/model/model.go 中存在对应的领域模型User(见 pkg/auth/model/model.go#L101-L114):

type User struct { CreatedAt time.Time `db:"created_at"` // Username is a unique identifier for the user. In password-based authentication, it is the email. Username string `db:"display_name" json:"display_name"` // FriendlyName, if set, is a shorter name for the user than // Username. Unlike Username, it does not identify the user (it // might not be unique); use it in the user's GUI rather than in // backend code. FriendlyName *string `db:"friendly_name" json:"friendly_name"` Email *string `db:"email" json:"email"` EncryptedPassword []byte `db:"encrypted_password" json:"encrypted_password"` Source string `db:"source" json:"source"` ExternalID *string `db:"external_id" json:"external_id"` }

从服务端源码可以确认几个关键事实:

  • 服务端的Username即对外暴露的id字段,它是认证体系中的唯一标识;在基于密码的认证模式下,用户名就是邮箱(源码注释原文:"In password-based authentication, it is the email"),这解释了为什么启用 API 认证时email会变成必填。
  • 服务端FriendlyName的注释与服务端db标签均指向friendly_name列,明确说明其仅供 GUI 展示、不参与身份识别,与 SDK 文档语义完全一致。
  • SDK 文档中的creation_date(Unix 秒)在服务端表现为CreatedAt time.Time,是同一个字段在不同 API 层的时间表示形式。

id 的校验规则

创建用户时传入的id会经过服务端校验,规则见 pkg/auth/model/validation.go 中的ValidateAuthEntityID:

func ValidateAuthEntityID(name string) error { if len(name) == 0 { return fmt.Errorf("empty name: %w", ErrValidationError) } if strings.Contains(name, kv.PathDelimiter) { return fmt.Errorf("name contains delimiter %s: %w", kv.PathDelimiter, ErrValidationError) } return nil }

即:id不能为空,且不能包含路径分隔符(kv.PathDelimiter)。这在 pkg/auth/basic_service.go 的CreateUser中被首先调用(见 pkg/auth/basic_service.go#L174-L176),不满足校验时直接返回InvalidUserID与校验错误。

User 对象与 JSON 的序列化互转

User继承自 pydantic 的BaseModel,其Config中开启了allow_population_by_field_name = True与validate_assignment = True,因此既可以通过字段名构造,也可以在赋值时触发类型校验。模型内置了四个序列化方法(实现见 clients/python/lakefs_sdk/models/user.py):

方法作用
to_str()返回带别名的字符串表示(pprint.pformat)
to_json()返回 JSON 字符串(json.dumps)
to_dict()返回字典(by_alias=True,且exclude_none=True,即 None 字段会被剔除)
from_json(json_str)从 JSON 字符串反序列化出User实例
from_dict(obj)从字典构造User实例

从 JSON 字符串创建 User

from lakefs_sdk.models.user import User # 一个真实的用户 JSON(假设来自 /auth/users 接口响应) json = '{"id": "jane.doe", "creation_date": 1690000000, "friendly_name": "Jane", "email": "jane.doe@example.com"}' # create an instance of User from a JSON string user_instance = User.from_json(json) # 访问字段 print(user_instance.id) # jane.doe print(user_instance.creation_date) # 1690000000 print(user_instance.friendly_name) # Jane print(user_instance.email) # jane.doe@example.com

注意:from_json内部实现为cls.from_dict(json.loads(json_str)),因此 JSON 中缺失的字段(如friendly_name、email)会解析为None,而非报错;但id与creation_date是必填字段,缺失时 pydantic 会抛出校验异常。

输出 JSON 字符串与字典

# print the JSON string representation of the object print(user_instance.to_json()) # 输出: {"id": "jane.doe", "creation_date": 1690000000, "friendly_name": "Jane", "email": "jane.doe@example.com"} # convert the object into a dict user_dict = user_instance.to_dict() print(user_dict) # {'id': 'jane.doe', 'creation_date': 1690000000, 'friendly_name': 'Jane', 'email': 'jane.doe@example.com'} # create an instance of User from a dict user_from_dict = User.from_dict(user_dict)

由于to_dict()采用exclude_none=True,当一个字段未被设置时它不会出现在字典中:

partial_user = User(id="alice", creation_date=1690000000) print(partial_user.to_dict()) # {'id': 'alice', 'creation_date': 1690000000} # friendly_name / email 为 None 被剔除

这个特性在实际对接 REST API 时非常实用:未设置的可选字段不会以null形式出现在请求或响应体中,避免多余的null字段。

通过 SDK 管理用户(Auth API 实战)

User模型在 SDK 中主要作为 auth_api.py 的入参与返回值出现。该 API 对应 api/swagger.yml 中tags: [auth]的/auth/users系列端点。以下四个方法覆盖了用户生命周期的完整闭环。

创建用户:create_user

创建用户时,需要先构造UserCreation模型(定义于 clients/python/lakefs_sdk/models/user_creation.py),它只有一个必填字段id:

from lakefs_sdk.api.auth_api import AuthApi from lakefs_sdk.models.user_creation import UserCreation from lakefs_sdk import Configuration, ApiClient configuration = Configuration(host="http://localhost:8000") configuration.access_token = "your_access_token" client = ApiClient(configuration) auth_api = AuthApi(client) user_creation = UserCreation(id="jane.doe") # 创建用户,成功返回 201 及 User 对象 created_user = auth_api.create_user(user_creation=user_creation) print(created_user.id) print(created_user.creation_date) # Unix 秒时间戳

对应 REST 为POST /auth/users(见 api/swagger.yml#L2234-L2264),服务端在 pkg/auth/basic_service.go 的CreateUser中执行model.ValidateAuthEntityID校验,并使用kv.SetMsgIf(CAS 语义)写入用户数据——若用户已存在,返回409 Conflict,对应 swagger 中定义的Conflict响应。

查询单个用户:get_user

user = auth_api.get_user(user_id="jane.doe") print(user.id) print(user.creation_date) print(user.friendly_name) print(user.email)

对应 REST 为GET /auth/users/{userId}(见 api/swagger.yml#L2273-L2294),用户不存在时返回404 NotFound。在服务端,GetUser会先校验请求者权限,再通过缓存与 KV 存储定位用户记录(见 pkg/auth/basic_service.go#L143-L153)。

分页列出用户:list_users

list_users支持三个分页参数(见 clients/python/lakefs_sdk/api/auth_api.py#L4696-L4726):

users_page = auth_api.list_users( prefix="jane", # 返回以该值开头的条目,可选 after=None, # 返回该值之后的条目,可选 amount=100, # 返回条数,可选,范围 -1 ~ 1000 ) for user in users_page.results: print(user.id, user.creation_date, user.friendly_name, user.email) # 分页信息 print(users_page.pagination.has_more) print(users_page.pagination.next_offset)

返回类型为UserList(定义于 clients/python/lakefs_sdk/models/user_list.py),包含results(User[])与pagination两个必填字段,对应 api/swagger.yml#L1115-L1126 的UserListschema。三个参数的行为如下:

  • prefix:只返回 id 以该值开头的用户;
  • after:从指定用户之后继续分页(用于翻页);
  • amount:单页条数,合法范围-1到1000。

删除用户:delete_user

# 成功时返回 None(HTTP 204) auth_api.delete_user(user_id="jane.doe")

对应 REST 为DELETE /auth/users/{userId}(见 api/swagger.yml#L2295-L2304)。服务端的DeleteUser除了删除用户记录外,还会级联清理该用户的凭证(credentials),见 pkg/auth/basic_service.go#L190-L203 中的deleteUserCredentials调用,因此在删除用户后其关联的 Access Key 也随之失效。

获取当前登录用户:get_current_user

current = auth_api.get_current_user() print(current.user.id)

对应 REST 为GET /auth/user(见 api/swagger.yml#L2100-L2111),返回CurrentUser对象(见 api/swagger.yml#L925-L931),其唯一的user字段类型正是User。

与 lakectl 命令行的对照

User模型的字段在 lakectl 的用户管理命令中也有直接体现,便于交叉验证:

  • cmd/lakectl/cmd/auth_users_create.go:lakectl auth users create --id <username>,内部调用CreateUserWithResponse,成功后展示ID与Creation Date;
  • cmd/lakectl/cmd/auth_users_list.go:lakectl auth users list,内部读取每个用户的CreationDate、FriendlyName、Email、Id字段并渲染成表格。其展示逻辑值得注意:
username := cmdutils.Coalesce(user.FriendlyName, user.Email, user.Id)

即在表格的 "User" 列中,优先显示friendly_name,其次email,兜底才用id。这恰好印证了模型文档中"friendly_name用于 UI 展示"的设计意图。

使用建议与注意事项

  1. id一经创建不可修改:设计用户体系时,应把id当作稳定的业务主键对待;如需要展示名,请使用friendly_name。
  2. email与认证模式强相关:启用 API 认证时email必填且会被邀请登录;关闭 API 认证时email会被忽略。同时当前内置认证器要求邮箱小写且唯一,写入前建议做lower()归一化。
  3. 时间戳语义:creation_date是 Unix Epoch 秒(int64),在 Python 中可用datetime.fromtimestamp(user.creation_date)转换为人可读时间;lakectl 中也同样用time.Unix(user.CreationDate, 0)处理(见 cmd/lakectl/cmd/auth_users_list.go#L34)。
  4. 删除是级联的:delete_user会同时清理用户凭证,属于不可逆操作,生产环境需谨慎。

延伸阅读

  • 模型定义:clients/python/lakefs_sdk/models/user.py、clients/python/lakefs_sdk/models/user_creation.py、clients/python/lakefs_sdk/models/user_list.py
  • API 客户端:clients/python/lakefs_sdk/api/auth_api.py
  • OpenAPI 规范:api/swagger.yml(Userschema 见 api/swagger.yml#L900-L923,/auth/users端点见 api/swagger.yml#L2209-L2304)
  • 服务端实现:pkg/auth/basic_service.go、pkg/auth/model/model.go、pkg/auth/model/validation.go
  • CLI 对照:cmd/lakectl/cmd/auth_users_create.go、cmd/lakectl/cmd/auth_users_list.go
  • SDK 总览:clients/python/README.md
  • 数据工程
  • 数据湖
  • 大数据
  • 对象存储
  • 后端

【免费下载链接】lakeFS

lakeFS - Data version control for your data lake | Git for data

项目地址:https://gitcode.com/gh_mirrors/la/lakeFS
点击查看免费下载

相关推荐

上一篇:3步快速转换CAJ为PDF:告别学术文献格式困扰的终极指南
下一篇:DXVK终极指南:在Linux上流畅运行Windows游戏的完整教程

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/13 9:50:05

跨设备PS5串流实战:软硬件解析与部署指南

最近一段时间&#xff0c;我一直在折腾一个叫 AnyPS5 的小项目。一句话概括&#xff0c;就是让 PS5 不再被锁在电视和沙发上&#xff0c;让它在手机、平板、电脑&#xff0c;甚至是我那台吃灰的老笔记本上都能顺畅玩起来。这个想法源于一次很实际的痛&#xff1a;客厅电视被家里…

作者头像 李华
网站建设 2026/10/13 9:49:28

文件操作底层机制:C与Python读写、缓冲区与原子替换实战解析

文件操作&#xff0c;是很多人的编程启蒙&#xff0c;却是工作后最容易凭记忆混过去的一块内容。我见过太多人面试时能把fread的每个参数背得滚瓜烂熟&#xff0c;真到线上排查问题——比如一条应用补丁命令执行失败&#xff0c;系统提示“操作期间更改的所有文件已被回滚”——…

作者头像 李华
网站建设 2026/10/13 9:47:58

Django+LLM大模型的滴滴出行分析与出租车供需平衡优化系统设计

每年准备毕业设计的同学里&#xff0c;总有一批人会盯上网约车和出租车数据。滴滴早在几年前就开放过规模不小的订单轨迹数据集&#xff0c;加上天气、节假日、POI这些公开数据源&#xff0c;做出来的分析系统既贴近生活场景&#xff0c;又能把数据清洗、时序预测、可视化这些硬…

作者头像 李华
网站建设 2026/10/13 9:45:17

华为云ModelArts模型训练与部署实战:从零基础到在线服务上线

从零开始啃下华为云ModelArts&#xff1a;模型训练与部署的考点都在这里最近不少朋友在准备华为云相关认证和ICT大赛云赛道&#xff0c;问到我ModelArts怎么上手。这个服务确实有点绕&#xff0c;名字听着高大上&#xff0c;真去操作的时候&#xff0c;光一个“训练作业怎么调参…

作者头像 李华
网站建设 2026/10/13 9:44:58

动态页面爬虫更稳的解法:先找API再用Requests请求

很多新手在接触动态页面爬虫时&#xff0c;第一反应就是把 Playwright 或 Selenium 拉出来&#xff0c;模拟浏览器慢慢等页面渲染完&#xff0c;再把 HTML 抓下来解析。这个思路不算错&#xff0c;但属于“最重”的方案。我做了这么多年的数据采集&#xff0c;有一个非常深刻的…

作者头像 李华