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 · 4275 次点击
    这是一个创建于 899 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 中的行为似乎文档不是很清楚,感觉需要自己踩坑,
    支持一下,楼主加油
    ospider
        13
    ospider  
       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  
       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   ·   我们的愿景   ·   实用小工具   ·   2842 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 07:10 · PVG 15:10 · LAX 00:10 · JFK 03:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.