Python Web API 后端终极开发框架 JSONClasses

2021-11-03 11:17:50 +08:00
 cheunghy
Python 在很多领域有很强大的功能,这些框架往往使用简单,功能强大,可操作性强。然而在 web 领域有所欠缺。

纵观整个后台开发,比起前端大火大热的 React ,SwiftUI ,Jetpack Compose ,前端已经迈入了声明代替编写过程的时代,而后端还仍然滞后。

所以,考虑到这两个因素,我带领我司研发了声明式的 Python 后端开发框架 JSONClasses ,把最新的理念和高效带给 Python 社区。

JSONClasses 是底层框架,你可以用其完成任何数据转换验证,ORM 操作和 CRUD 功能。他的功能却像高层框架:支持权限、多用户登录,关联关系,增删改查,筛选查询排序。它是声明式后台开发,绝对不是低码无码开发。虽然后台变成可以只有 1 个文件,docker 直接部署,但性质不同。

教程文章
https://medium.com/@victor.teo/python-web-api-development-with-jsonclasses-67f618eaedc6

官方网站
https://www.jsonclasses.com

官方文档
https://docs.jsonclasses.com

Github
https://github.com/fillmula/jsonclasses

示例代码 (数据验证,计算型字段,CRUD ,数据库操作)
```python
@api
@pymongo
@jsonclass
class Article:
id: str = types.readonly.str.primary.mongoid.required
title: str
content: str
words: int = types.int.getter(types.this.fval('content').split(" ").len)
published: bool = False
created_at: datetime = types.readonly.datetime.tscreated.required
updated_at: datetime = types.readonly.datetime.tsupdated.required
```
4621 次点击
所在节点    Python
41 条回复
cheunghy
2021-11-03 15:24:18 +08:00
@triangle111 types.validate(types...) 管道校验呀,很多操作都有 API 的。
像我们自己用的 types.str.securepw.length(8,16),这就是校验密码的方式。
cheunghy
2021-11-03 15:25:12 +08:00
@learningman vscode 加 Pylance ,补全是完整的呀。
cheunghy
2021-11-03 15:25:50 +08:00
@wliansheng 视图是没有的,前后端分离的。
cheunghy
2021-11-03 15:26:50 +08:00
@lanlanye 是这个吗 https://www.django-rest-framework.org/api-guide/viewsets/
刚看了下,这个要写 viewcontroller ,太多胶水代码了。
lanlanye
2021-11-03 15:56:53 +08:00
@cheunghy 是这个,在 Django 中定义好模型后只需要几行代码就可以创建一个 CRUD 的接口,同样几行可以添加简单的筛选搜索排序等定制功能,做数据接口的话并不需要写多少东西。
cheunghy
2021-11-03 16:02:14 +08:00
@lanlanye CRUD 和筛选搜索排序关联查询这些的话,用 JSONClasses 加五个字符:@api ,和一个换行符就可以了,并且可以嵌套多级查询。内在逻辑写在 types 管道中,又省下很多。
so1n
2021-11-03 16:33:22 +08:00
pydantic 的结合 orm 版本?
cheunghy
2021-11-03 16:48:50 +08:00
@so1n 是的,一部分功能这样比喻是很形象的。

在这里大概做一个比较
pydantic 初始化既验证,而 jsonclasses 是初始化后,允许你自由操作,调用 validate 才验证。
pydantic 仅强调验证,缺少数据流转换。
pydantic 不支持 orm 一直很伤,这个需求其实也很迫切。
pydantic 与 fastapi 的集成,解决一些问题,但也带来很多不够灵活的问题。这种集成仍不能避免复制粘贴 CRUD ,写过多胶水。
pydantic 的验证写起来麻烦,需要 @validate 加函数,而 jsonclasses 中,你可以用 types 管道写验证,也可以插 lambda 或函数进入管道。
pydantic 没有 graph 功能,就是多对象关联和数据库中的多对象分表集体写入。
abersheeran
2021-11-03 16:55:31 +08:00
看了一下,开发一些 CRUD 的 API 服务确实不错,不过我没看到怎么定制化。假设我用你这个创建了一个 web application 了,我还想额外加一些处理器去其他 URL 的内容,怎么做?
cheunghy
2021-11-03 17:00:26 +08:00
@abersheeran 没有限制功能的。app = create_fastapi_app()或 app = create_flask_app()之后,正常写 fastapi 或 flask 的 routes 就可以了。这种情况下,JSONClasses 全套 ORM 功能,以及核心包的 validate 等功能,都是可以使用的。相对于一些业务逻辑的话,比如说“领导批准”,其实可以通过 PATCH ( CRUD 中的 U )来实现,声明 types.onupdate(),触发关联的查询和其他的回调比如发出短信、发出邮件都可以的。
abersheeran
2021-11-03 17:25:36 +08:00
@cheunghy flask 或者 fastapi 好像都是没有给指定一批路由增加中间件的功能,你这个框架的鉴权之类的功能是怎么实现的?会不会影响到我自定义的处理器?
cheunghy
2021-11-03 17:39:37 +08:00
@abersheeran 你可以把新的 middleware 加在获得的 app 对象后面。flask 和 fastapi 两者的集成在框架内部 session 的实现是不同的。可以配置跳过不用的。
sivacohan
2021-11-03 17:43:29 +08:00
楼主能描述一下创造这个框架时候,希望使用的场景吗?

我看完文档觉得对于文档存储类使用起来比较方便。
对统计类(类 ERP 、CRM )这类数据好像没有额外的加持,同时因为绑定了 mongo ,对事务类支持可能也有风险。
cheunghy
2021-11-03 17:53:38 +08:00
@sivacohan
没有绑定 MongoDB ,只是还没支持 SQL 。支持 SQL 后,API 用法不变。
目前 ORM 功能是完整的,在 CRUD 方面,还没有思考统计图表等功能,如果是统计图表,需要手动写 routes 和 ORM 查询。会先收集统计图表的需求类型,以后会构思这方面的声明式写法。
事务的话,mongoDB 新版本有 transaction ,应该没什么问题吧。
demonlin
2021-11-04 00:05:28 +08:00
建议:
官网以及文档加入国际化
cheunghy
2021-11-04 17:01:53 +08:00
@demonlin 目前文档和官网都是英文的。简体中文等有兴趣的人来翻译。
demonlin
2021-11-04 17:56:36 +08:00
@cheunghy 这个首先需要文档和官网的 github 仓库有集成国际化的方案,并且通过参与翻译的方式,而不是所有包含文字的文件都复制一份翻译,在集成后可选择如 https://www.transifex.com/home/ 的方式进行文案翻译
demonlin
2021-11-04 17:58:07 +08:00
@demonlin "并且通过参与翻译的方式" => "并且告知参与翻译的方式"
llsquaer
2021-11-13 17:54:13 +08:00
国内开源的通病,第一步国际化...才从知乎激烈讨论过来,所以一看就联想到了.莫怪
cheunghy
2021-11-13 20:32:48 +08:00
@llsquaer 我们的产品是从没本土化,不是第一步国际化

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/812666

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX