Python Web API 后端终极开发框架 JSONClasses - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
cheunghy
V2EX    Python

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

  •  
  •   cheunghy
    zhangkaiyulw 2021-11-03 11:17:50 +08:00 5063 次点击
    这是一个创建于 1440 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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
    ```
    41 条回复    2021-11-13 20:33:06 +08:00
    Outliver0
        1
    Outliver0  
       2021-11-03 11:24:14 +08:00
    网站挂了吗,我访问不了
    janxin
        2
    janxin  
       2021-11-03 11:27:08 +08:00
    直接怼在DB 上么...
    cheunghy
        3
    cheunghy  
    OP
       2021-11-03 11:46:43 +08:00
    @Outliver0 你要科学访问
    cheunghy
        4
    cheunghy  
    OP
       2021-11-03 11:47:25 +08:00
    @janxin 不是的,含有 ORM
    loading
        5
    loading  
       2021-11-03 11:49:06 +08:00
    这和 orm 区别有多少,没看出来。
    qionnian
        6
    qionnian  
       2021-11-03 12:05:35 +08:00
    要 python3.10 啊
    HashV2
        7
    HashV2  
       2021-11-03 12:20:31 +08:00
    请问和 flask 、django 、tornado 这些 python web 框架相比优势在哪, 是性能更强还是更易用啊?
    cheunghy
        8
    cheunghy  
    OP
       2021-11-03 12:36:52 +08:00
    @HashV2 区别就是一周工作量变成 2 小时。django 是类似 ror 的传统框架,代替以前的 php 和 java 的,现在看架构已经过时了。flask 和 fastapi 是 jsonclasses 可以选择使用的。 @jsonclass 就有比 pydantic 更完善的功能,@pymongo 就能获得 SQLAlchemy ORM 一样的功能,再 @api ,就拥有 CRUD ,支持各式关联查询。再 @authorized ,就可以直接获得登录功能,不需要写登录了。功能都是可选的,没有底层访问限制。
    Outliver0
        9
    Outliver0  
       2021-11-03 14:04:06 +08:00
    @cheunghy 已经科学上网了 不科学上网本站都访问不了
    feiandxs
        10
    feiandxs  
       2021-11-03 14:23:48 +08:00
    好奇怪的用法。

    这套东西我自己倒也有几个类似的,毕竟写几年业务下来谁都手头有一些封装,我也大量写 web 服务端,所以很多场景需求其实就那几个,我有好几种封装, 其中有一些也是用声明式的写法的。

    我大概看了下你的文档,虽然不全,起码看起来挺专业,比很多项目要好太多。
    但这个东西本身总给我一个奇怪的感觉,它很像一个扩展了的 orm 。

    对我而言,这种东西更适合作为一个放在自己项目 \utils\ 下的一个工具,而不适合作为组织引导项目的框架。
    sudoy
        11
    sudoy  
       2021-11-03 14:25:21 +08:00
    支持一下,不过我个人还是习惯 flask 或者 django 这种服务端渲染的
    crazypig14
        12
    crazypig14  
       2021-11-03 14:51:42 +08:00
    文档里没找到做 authorized 的地方,
    目前看最核心的地方好像就是 embeded 和 linked ,但这两个在 presenting/persistence/query 中的行为似乎文档不是很清楚,感觉需要自己踩坑,
    支持一下,楼主加油
    4BVL25L90W260T9U
        13
    4BVL25L90W260T9U  
       2021-11-03 14:54:08 +08:00
    官网的代码配色改一下吧,你这个重点在装饰器,配色里装饰器确实灰色的。。
    cheunghy
        14
    cheunghy  
    OP
       2021-11-03 14:55:11 +08:00
    @ospider 我们正在修改,等设计师把图做好,会整体更新官网。
    cheunghy
        15
    cheunghy  
    OP
       2021-11-03 14:57:51 +08:00
    @crazypig14 谢谢认真阅读文档。
    authorized 在 Guide 中的最后一个里面。
    linked 那些,我刚检查了下,确实除了 API 文档中,Guide 中缺少相关内容。目前其他一些方面也会存在些缺少文档的情况,我们会整理总结,在新版本中把文档补充到位。
    wliansheng
        16
    wliansheng  
       2021-11-03 15:02:16 +08:00
    写法很简洁,看了一遍文档,取代视图层面的代码好像没看到在哪,感觉适合一些快速小一点的项目
    triangle111
        17
    triangle111  
       2021-11-03 15:08:10 +08:00
    支持一下,看样子确实省事很多,不过后端也需要校验前端传递过来的数据,这样还是避免不了一些业务函数的开发。
    learningman
        18
    learningman  
       2021-11-03 15:10:50 +08:00
    这种声明式开发,写的时候没补全会难受死的。。。
    pengtdyd
        19
    pengtdyd  
       2021-11-03 15:21:35 +08:00
    说一个不是劝告的劝告,python 搞 web 是一个错误的方向,再努力都没用
    lanlanye
        20
    lanlanye  
       2021-11-03 15:22:24 +08:00
    大概看了一下,请问这个和 DRF 的 ModelViewSet 相比有什么优势?
    cheunghy
        21
    cheunghy  
    OP
       2021-11-03 15:24:18 +08:00
    @triangle111 types.validate(types...) 管道校验呀,很多操作都有 API 的。
    像我们自己用的 types.str.securepw.length(8,16),这就是校验密码的方式。
    cheunghy
        22
    cheunghy  
    OP
       2021-11-03 15:25:12 +08:00
    @learningman vscode 加 Pylance ,补全是完整的呀。
    cheunghy
        23
    cheunghy  
    OP
       2021-11-03 15:25:50 +08:00
    @wliansheng 视图是没有的,前后端分离的。
    cheunghy
        24
    cheunghy  
    OP
       2021-11-03 15:26:50 +08:00
    @lanlanye 是这个吗 https://www.django-rest-framework.org/api-guide/viewsets/
    刚看了下,这个要写 viewcontroller ,太多胶水代码了。
    lanlanye
        25
    lanlanye  
       2021-11-03 15:56:53 +08:00
    @cheunghy 是这个,在 Django 中定义好模型后只需要几行代码就可以创建一个 CRUD 的接口,同样几行可以添加简单的筛选搜索排序等定制功能,做数据接口的话并不需要写多少东西。
    cheunghy
        26
    cheunghy  
    OP
       2021-11-03 16:02:14 +08:00
    @lanlanye CRUD 和筛选搜索排序关联查询这些的话,用 JSONClasses 加五个字符:@api ,和一个换行符就可以了,并且可以嵌套多级查询。内在逻辑写在 types 管道中,又省下很多。
    so1n
        27
    so1n  
       2021-11-03 16:33:22 +08:00
    pydantic 的结合 orm 版本?
    cheunghy
        28
    cheunghy  
    OP
       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
        29
    abersheeran  
       2021-11-03 16:55:31 +08:00
    看了一下,开发一些 CRUD 的 API 服务确实不错,不过我没看到怎么定制化。假设我用你这个创建了一个 web application 了,我还想额外加一些处理器去其他 URL 的内容,怎么做?
    cheunghy
        30
    cheunghy  
    OP
       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
        31
    abersheeran  
       2021-11-03 17:25:36 +08:00
    @cheunghy flask 或者 fastapi 好像都是没有给指定一批路由增加中间件的功能,你这个框架的鉴权之类的功能是怎么实现的?会不会影响到我自定义的处理器?
    cheunghy
        32
    cheunghy  
    OP
       2021-11-03 17:39:37 +08:00
    @abersheeran 你可以把新的 middleware 加在获得的 app 对象后面。flask 和 fastapi 两者的集成在框架内部 session 的实现是不同的。可以配置跳过不用的。
    sivacohan
        33
    sivacohan  
    PRO
       2021-11-03 17:43:29 +08:00
    楼主能描述一下创造这个框架时候,希望使用的场景吗?

    我看完文档觉得对于文档存储类使用起来比较方便。
    对统计类(类 ERP 、CRM )这类数据好像没有额外的加持,同时因为绑定了 mongo ,对事务类支持可能也有风险。
    cheunghy
        34
    cheunghy  
    OP
       2021-11-03 17:53:38 +08:00
    @sivacohan
    没有绑定 MongoDB ,只是还没支持 SQL 。支持 SQL 后,API 用法不变。
    目前 ORM 功能是完整的,在 CRUD 方面,还没有思考统计图表等功能,如果是统计图表,需要手动写 routes 和 ORM 查询。会先收集统计图表的需求类型,以后会构思这方面的声明式写法。
    事务的话,mongoDB 新版本有 transaction ,应该没什么问题吧。
    demonlin
        35
    demonlin  
       2021-11-04 00:05:28 +08:00
    建议:
    官网以及文档加入国际化
    cheunghy
        36
    cheunghy  
    OP
       2021-11-04 17:01:53 +08:00
    @demonlin 目前文档和官网都是英文的。简体中文等有兴趣的人来翻译。
    demonlin
        37
    demonlin  
       2021-11-04 17:56:36 +08:00
    @cheunghy 这个首先需要文档和官网的 github 仓库有集成国际化的方案,并且通过参与翻译的方式,而不是所有包含文字的文件都复制一份翻译,在集成后可选择如 https://www.transifex.com/home/ 的方式进行文案翻译
    demonlin
        38
    demonlin  
       2021-11-04 17:58:07 +08:00
    @demonlin "并且通过参与翻译的方式" => "并且告知参与翻译的方式"
    llsquaer
        39
    llsquaer  
       2021-11-13 17:54:13 +08:00
    国内开源的通病,第一步国际化...才从知乎激烈讨论过来,所以一看就联想到了.莫怪
    cheunghy
        40
    cheunghy  
    OP
       2021-11-13 20:32:48 +08:00
    @llsquaer 我们的产品是从没本土化,不是第一步国际化
    cheunghy
        41
    cheunghy  
    OP
       2021-11-13 20:33:06 +08:00
    @llsquaer 有知乎链接吗
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     956 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 19:31 PVG 03:31 LAX 12:31 JFK 15:31
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86