首页 > 编程语言 >home-assistant core 源码粗读--如何管理多用户-用户存储(二)

home-assistant core 源码粗读--如何管理多用户-用户存储(二)

时间:2024-02-21 16:33:36浏览次数:38  
标签:core -- AuthStore self 源码 ._ async data store

程序中搜索User,  很容易命中homeassistant/auth/models.py

程序中大量使用了attr.s 进行模型的声明。上篇说过dataclass,以及BaseModel , 区别见: https://www.modb.pro/db/412679

文件中定义了5个模型,这里只需要猜测他们的意思即可,这里重点分析User。

程序中搜索User, 很容易命中homeassistant/auth/auth_store.py  # 进行User相关的存取相关。

需要细看的是AuthStore.__init__,AuthStore.async_get_users,AuthStore.async_create_user,

def __init__(self, hass: HomeAssistant) -> None:
"""Initialize the auth store."""
self.hass = hass
self._loaded = False
self._users: dict[str, models.User] = None # 从AuthStore.async_get_user可知,_users的结构是:{user_id:user}
self._groups: dict[str, models.Group] = None # type: ignore[assignment] # 同理直接猜测 _groups的结构是 {group_id:group}
self._perm_lookup: PermissionLookup = None # type: ignore[assignment]
self._store = Store[dict[str, list[dict[str, Any]]]](
hass, STORAGE_VERSION, STORAGE_KEY, private=True, atomic_writes=True
) # 自行百度python 的泛型:做类型提示和编辑器类型校验用的。 Store 内部的结构可以从Store.async_save 中看到就是一个需要存储的结构。
在官网搜索storage:

 跳转到 https://www.home-assistant.io/integrations/analytics/   可以看到

Your data is securely stored in Cloudflare’s Key-Value store. It will be stored for a maximum of 60 days since the last update. Only aggregated data is made publicly available.

This is an example of how the information is stored:

uuid:12a3456bc78d90123ef4567g789012h3

{‘version’: ‘2024.2.2’, ‘installation_type’: ‘Home Assistant OS’, ‘country’: ‘NO’}

 

在阅读AuthStore.async_create_user 过程中可以发现调用了self._async_schedule_save() , self._store.async_delay_save()、self._data_to_save()

return {
"users": users,
"groups": groups,
"credentials": credentials,
"refresh_tokens": refresh_tokens,
}

我们再 看看self._store.async_delay_save()。函数收到的是一个Callable 

homeassistant/helpers/storage.py L179
self._data = {
"version": self.version,
"minor_version": self.minor_version,
"key": self.key,
"data_func": data_func,
}

可以看到data_func 也只是一个callable 。

接着看主逻辑: self._async_callback_delayed_write、self._async_handle_write_data() , 可以看到_async_handle_write_data 内部对data_func进行执行,并创建成data字段。

接下来就是对self._data 进行保存L352: self._async_write_data(self.path, data) 、self._write_data 至此用户数据保存完成。至于里面的path参数就是保存到了某个文件中(可以看看此文件的开头:STORAGE_DIR)。

回过头来看上面的return 部分,可以看到一个保存流程,把用户,用户组,用户身份,相关的用户token都进行了一次保存,而且是以json 的形式保持到了文件中,没有接入数据库!!

 

所以homeassistant 目前只适合家庭级的用户使用。期待官方后续上线用户组,把用户等保存到数据库中。

 

标签:core,--,AuthStore,self,源码,._,async,data,store
From: https://www.cnblogs.com/xunhanliu/p/18025578

相关文章

  • ChemDraw Pro 2022:呈现专业化学绘图的极 致之作 mac/win版
    PerkinElmerChemDrawPro2022是一款功能强大的化学绘图软件,专为化学家、科研工作者和教育者设计。这款软件凭借其卓越的性能和丰富的功能,已经成为化学绘图领域的领导者。→→↓↓载PerkinElmerChemDrawPro2022mac/win版 ChemDrawPro2022提供了广泛的化学符号和工具,使......
  • Java导入功能实现
    今天记录一下Java实现导入数据到数据,导入失败显示如下,会告诉你哪里出错了。controller代码实现@Operation(summary="导入工单")@PostMapping("/importOrderData")publicBaseResponse<String>importOrderData(@RequestParam@Parameter(name="excelFile",......
  • 《程序是怎样跑起来的》第一章第一节读后感
    在阅读了《程序是怎样跑起来的》第一章第一节之后,我有以下几点感悟:编程语言的重要性:在这一节中,作者强调了编程语言在程序运行过程中的关键作用。编程语言是程序员与计算机进行沟通的桥梁,通过编程语言,我们可以将复杂的逻辑和算法转化为计算机能理解的指令。因此,选择......
  • 20240221总结
    P4311士兵占领考虑先把棋盘放满,判掉无解,并把问题转化为拿走最多的棋子。这个问题就一眼最大流了,对于行和列分别建M,N个节点,源点向行节点连流量为该行最多可删个数的边,列节点向汇点连该列最多可删个数的边,对于每个可放士兵的(i,j),从行节点i向列节点j连一条流量为1的边,跑最大流......
  • Zookeeper-批量启动和停止zookeeper节点脚本
    背景由于zookeeper的服务启动和停止,需要一台一台地去启动和停止。当部署的zookeeper节点多时非常麻烦,所以编写下面的脚本,用于提升启动和停止的效率。执行如下脚本需要确保:脚本存放的服务器与所有的zookeeper节点直接可以免密登录(服务器之间建立互信)。1、编辑脚本vi manage-z......
  • 《Effective Java》阅读笔记-第九章
    EffectiveJava阅读笔记第九章通用编程第57条将局部变量的作用域最小化将局部变量的作用域最小化,可以增强代码的可读性和可维护性,并降低出错的可能。将局部变量的作用域最小化,最好的办法就是在第一次使用变量的地方声明它。几乎每一个局部变量都应该进行初始化。第5......
  • 《Effective Java》阅读笔记-第八章
    EffectiveJava阅读笔记第八章方法第49条检查参数的有效性基于“发生错误后应尽快检测出错误”这一通用原则,应对方法的参数进行检查。Java7中增加了Objects.requireNonNull方法,可以很方便的对参数进行null检查并抛出异常:publicvoidsomeMethod(Stringargs){ar......
  • Dynamics 365开启审计日志
    1.启用审核选择设置(齿轮图标)>高级设置>系统设置>审核选项卡。或者,从 PowerApps主页,选择设置(齿轮图标)>高级设置>设置>审核>全局审核设置。在审核设置下,启用以下复选框:启动审核(StartAuditing)审核用户访问(Audituseraccess)(注意:仅捕获用户登录)启动读取审核(St......
  • Linux服务器配置nginx访问静态网页
    配置nginx 打开conf文件进行编辑:sudonano/etc/nginx/nginx.conf在http块内添加:server{listen80;server_namexxx.your_domain.com;root/root/work/your_web_folder;indexindex.html;}重启nginx:sudoservicenginxrestart如果......
  • 《Effective Java》阅读笔记-第十一章
    EffectiveJava阅读笔记第十一章并发第78条同步访问共享的可变数据多线程访问变量时,需要进行同步,否则就会产生并发问题。同步代码块、加锁等或者直接不共享变量,也就是将可变数据限制在单个线程内。ThreadLocal这种第79条避免过度同步为了避免活性失败和安全性失败......