V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
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 · Nov 3, 2021 · 5587 views
    This topic created in 1636 days ago, the information mentioned may be changed or developed.
    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 replies    2021-11-13 20:33:06 +08:00
    Outliver0
        1
    Outliver0  
       Nov 3, 2021
    网站挂了吗,我访问不了
    janxin
        2
    janxin  
       Nov 3, 2021
    直接怼在 DB 上么...
    cheunghy
        3
    cheunghy  
    OP
       Nov 3, 2021
    @Outliver0 你要科学访问
    cheunghy
        4
    cheunghy  
    OP
       Nov 3, 2021
    @janxin 不是的,含有 ORM
    loading
        5
    loading  
       Nov 3, 2021
    这和 orm 区别有多少,没看出来。
    qionnian
        6
    qionnian  
       Nov 3, 2021
    要 python3.10 啊
    HashV2
        7
    HashV2  
       Nov 3, 2021
    请问和 flask 、django 、tornado 这些 python web 框架相比优势在哪, 是性能更强还是更易用啊?
    cheunghy
        8
    cheunghy  
    OP
       Nov 3, 2021
    @HashV2 区别就是一周工作量变成 2 小时。django 是类似 ror 的传统框架,代替以前的 php 和 java 的,现在看架构已经过时了。flask 和 fastapi 是 jsonclasses 可以选择使用的。 @jsonclass 就有比 pydantic 更完善的功能,@pymongo 就能获得 SQLAlchemy ORM 一样的功能,再 @api ,就拥有 CRUD ,支持各式关联查询。再 @authorized ,就可以直接获得登录功能,不需要写登录了。功能都是可选的,没有底层访问限制。
    Outliver0
        9
    Outliver0  
       Nov 3, 2021
    @cheunghy 已经科学上网了 不科学上网本站都访问不了
    feiandxs
        10
    feiandxs  
       Nov 3, 2021
    好奇怪的用法。

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

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

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

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

    我看完文档觉得对于文档存储类使用起来比较方便。
    对统计类(类 ERP 、CRM )这类数据好像没有额外的加持,同时因为绑定了 mongo ,对事务类支持可能也有风险。
    cheunghy
        34
    cheunghy  
    OP
       Nov 3, 2021
    @sivacohan
    没有绑定 MongoDB ,只是还没支持 SQL 。支持 SQL 后,API 用法不变。
    目前 ORM 功能是完整的,在 CRUD 方面,还没有思考统计图表等功能,如果是统计图表,需要手动写 routes 和 ORM 查询。会先收集统计图表的需求类型,以后会构思这方面的声明式写法。
    事务的话,mongoDB 新版本有 transaction ,应该没什么问题吧。
    demonlin
        35
    demonlin  
       Nov 4, 2021
    建议:
    官网以及文档加入国际化
    cheunghy
        36
    cheunghy  
    OP
       Nov 4, 2021
    @demonlin 目前文档和官网都是英文的。简体中文等有兴趣的人来翻译。
    demonlin
        37
    demonlin  
       Nov 4, 2021
    @cheunghy 这个首先需要文档和官网的 github 仓库有集成国际化的方案,并且通过参与翻译的方式,而不是所有包含文字的文件都复制一份翻译,在集成后可选择如 https://www.transifex.com/home/ 的方式进行文案翻译
    demonlin
        38
    demonlin  
       Nov 4, 2021
    @demonlin "并且通过参与翻译的方式" => "并且告知参与翻译的方式"
    llsquaer
        39
    llsquaer  
       Nov 13, 2021
    国内开源的通病,第一步国际化...才从知乎激烈讨论过来,所以一看就联想到了.莫怪
    cheunghy
        40
    cheunghy  
    OP
       Nov 13, 2021
    @llsquaer 我们的产品是从没本土化,不是第一步国际化
    cheunghy
        41
    cheunghy  
    OP
       Nov 13, 2021
    @llsquaer 有知乎链接吗
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5709 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 129ms · UTC 08:18 · PVG 16:18 · LAX 01:18 · JFK 04:18
    ♥ Do have faith in what you're doing.