首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我刚写的 216 行代码的开源项目 Piiwee

最近一周没有写文章,因为有的时间都用来做了一个我的开源项目 Piiwee 。写代码,对于我来说,是一个和打游戏,吸食毒品类似的行为,一开始就停不下来,所以侵占了所有写文章的时间。

最终的开源项目,发布在

https://github.com/jianshuo/piiwee/

大家也可以用 PIP 直接安装:

项目起因

在 Python 世界,大家经常用 Peewee 做数据库的 ORM (对象关系映射),用 FastAPI 做服务器,但是,在这两个优秀的工具和最终的前端使用者之间,还有一个空隙。这个空隙包括了大多数系统都需要用到的‍‍

缓存

权限控制

RESTful API 用来提供数据

这三个虽然不难,但是似乎还是挺多的工作量。我看我们自己的代码里面都有几千行来处理这部分的内容。所以,我就做了一个极小的组件,来解决弥补这个缝隙。

实现的功能:

1. RESTful 的数据访问。对于任何类型的数据,通过类型和 id 获取信息,比如 /employees/1088, /customers/103 等等。如果自己有很多的数据库表格,可以在拥有权限的前提下,把所有希望提供服务的对象用这种 RESTful 的方式提供给前端。‍‍‍‍‍‍‍‍‍‍‍‍

2. 查询某个类型的所有对象,比如 /offices/,/orders/

3. 支持相关联的查询,比如某个办公室内的所有员工: /offices/3/employees, 或者某个订单的所有细节: /orders/10101/details

4. 所有的多对象查询,支持分页:?size=5&page=1

5. 支持排序,比如 ?sort=city, -created(就是按照 city 升序排序,再按照 -created 降序。‍‍‍‍‍

6. 支持 filter ,比如 ?filter=((role=="superman"+and+created>"2023-7-2")+or+id

7. 支持 fields 选择,比如 ?fields=employee_number,extension

8. 表级别的权限控制,比如缺省所有的表都不可读和写。但是对于给定的表格,可以指定特定的用户,或者所有的用户有读的权限,对于特定表,只允许特定的用户写。‍‍‍‍‍‍‍‍

9. 字段级别的权限控制。有一些 field 对于其他用户只能看(比如 Employee 对象的 last_name),有的不能看(比如 Employee 的 mobile,或者Order 的 price),而对于自己是拥有者的对象,有的字段可以看,也可以写(比如 mobile ),有的不能看但是可以写(比如 channel),有的可以看但不能写(比如 role,quota)。

10. 支持更新对象,比如 UPDATE /employees/1088,当然这个也是在当前用户有写权限的时候才会生效,否则报异常。

11. 支持删除一个给定类型和 ID 的对象

12. 所有的操作支持缓存。缓存可以使用服务器的内存,也可以使用 Redis 等外部的缓存服务。最终所有通过 id 存取的对象不再访问MySQL,直接从 Redis 服务。对于单个对象存储,或者select出来的对象集合都生效。在数据库不变的情况下,保证大多数的数据访问在 0.6 ms 以内。

我的版本

这是我们最近几周每个周一晚上「乐高日」的命题,我的项目是我的版本的答案。本着我信奉的「短的代码是好代码」的原则,实现如上功能的Piiwee 模块的代码量 216 行(加上 534 行注释)。

马克吐温说过,「如果我有更多的时间,我亲爱的朋友,我将能给你写更短的信」,我花了两周的时间,用我能想到的最短的代码实现了这些功能。

这张功能列表应该被无数的程序员对于特定的应用实现过很多遍了,所以 piiwee 就想用一个简单的实现,帮助大家不用每个项目都花时间做这些基本的工作。‍‍‍‍‍‍

思考点‍‍

大多数的部份比较简单,但是有几个部份还是花了些心思:‍‍‍‍‍‍‍‍‍‍‍

从 filter、sort、fields 等的字符串生成 peewee.Expression 类型的表达式。我很惊讶 peewee 自己不提供 str2expression 这样的解析器,所以需要借用 AST 写一个通用的字符串解析器。‍‍

SELECT 类型的缓存。所谓计算机领域的难题,只有两个,其中一个就是缓存过期问题(另一个是变量命名问题)。对于 SELECT 所表达的集合中,只要任何一行发生变化,整个缓存可能变化,也可能不变化。如何找到最好的缓存过期的策略的平衡点,花了些时间。

如何用尽量少,却又尽量可读、优雅的方式写代码。最终的代码,基本上做到了我对自己的代码的要求:每个函数代码不超过7行。(除了两三个「排比」类型的函数,一行到三行的函数居多)

欢迎大家帮我做 code review。如果有 bug (必然会有的,这只是第一个版本)欢迎提交 Pull Request。‍‍‍‍‍‍

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O8UY3Nt-JeW58OFzIfmxSrPA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券