Python web 终极 CRUD 方案(或许是) alpha 版本,征求一些反馈 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
fy
V2EX    分享创造

Python web 终极 CRUD 方案(或许是) alpha 版本,征求一些反馈

  •  
  •   y
    fy0 2021-04-19 02:00:39 +08:00 3156 次点击
    这是一个创建于 1636 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目地址

    https://github.com/fy0/pycrud/tree/dev

    说明

    简单来说这是一个高层 ORM,主要扩展了两个点,一个是支持用 JSON 做查询,还有就是支持角色权限

    定位和 GraphQL 相同,我觉得 GraphQL 思路很好,但是太难用了。

    安装

    pip install pycrud==1.0.0a0 

    特色

    • 需要写的代码量很少,支持主流 ORM,很容易集成到任意 web 框架(examples 中有一个 125 行单文件的 demo,Fastapi + SQLAlchemy 带权限管理)

    • 能从前端构造一些查询选择数据,例如 /api/user/list?id.ge=10&id.lt=15,适用于 CRUD 中的 RUD 操作

    • 有一套基于角色的鉴权,粒度是数据库字段,可以限制角色能查 /读 /写 /插入的字段,以及能删除的表

    demo 运行起来之后可以用 http://127.0.0.1:3000/redoc 看 API 文档。

    其他

    标题太夸张了而且违反了广告法,主要目的还是希望大家试一试,给一些意见。

    感觉 python web 用的人越来越少了

    11 条回复    2021-04-19 11:19:01 +08:00
    LeeReamond
        1
    LeeReamond  
       2021-04-19 04:06:09 +08:00 via Android
    没什么建议,个人微不足道的意见是这个项目出发点不合适。因为业务需求是复杂的,所以工程哲学永远是解耦,你这个项目又强行耦合回去了。开箱即用的带权限 curd 乍一听让人很兴奋,结果看了一下你的项目代码,问了一下自己,能用吗?答案是不符合需求,所以回到了上述的耦合问题。另外 pyweb 用户越来越少是伪命题
    wellsc
        2
    wellsc  
       2021-04-19 06:26:00 +08:00 via iPhone
    不是感觉,是事实
    popil1987
        3
    popil1987  
       2021-04-19 07:29:54 +08:00
    一般根据自己需求自己写 crud,cud 比较固定,r 预留一个传 stmt,自己用 sqlalchemy 组一个 stmt 当作参数就好
    WildCat
        4
    WildCat  
       2021-04-19 08:04:19 +08:00
    做一个类似 ActiveRecord 的方案都足够了。
    fy
        5
    fy  
    OP
       2021-04-19 10:17:44 +08:00
    @LeeReamond 个人微不足道的意见是这个回复出发点不合适。因为文章主题是复杂的,所以回复哲学永远是具体,你这个评论又强行抽象回去了。掷地有声的大段文本乍一听让人很兴奋,结果看了一下你的回复内容,问了一下自己,说的是什么?答案是没有具体内容,所以回到了上述的“具体”问题。

    ---

    没意义的话我就当没看到。想听听你对 graphql 有什么高见?
    fy
        6
    fy  
    OP
       2021-04-19 10:32:19 +08:00
    @popil1987

    因为觉得多数操作重复,所以进行了封装。直接捅到 API 那一层。

    @WildCat

    我在这块选的方案更接近于 Data Mapper 。不过主要花费精力还是在 json 转查询和拦截器上。
    youngce
        7
    youngce  
       2021-04-19 10:43:54 +08:00
    这种级别的 CRUD,drf 感觉更加简单
    carlclone
        8
    carlclone  
       2021-04-19 10:47:11 +08:00 via Android   1
    这种叫过度封装
    fy
        9
    fy  
    OP
       2021-04-19 10:56:48 +08:00
    @youngce

    DRF 不能处理条件查询、order 等内容

    可能我文档没有说清楚,这个库的 CRUD 可以提供一些查询条件,类似 graphql,但是易用性上要好得多。

    比如说:
    ```
    # 查询 2020 年 1 月 1 日之后的文章:
    http http://localhost:9999/api/topic/list?time.ge=1577808000

    # 创建新文章
    http -f POST "http://localhost:9999/api/topic/create" title="Hello Again" cOntent="Content changed" time=1578729600

    # 修改 id 为 1 的文章
    http -f POST "http://localhost:9999/api/topic/update?id=1" title="Hello Again" cOntent="Content changed"
    ```
    youngce
        10
    youngce  
       2021-04-19 11:04:34 +08:00   1
    @fy #9 “DRF 不能处理条件查询、order 等内容” 那说明你 drf 还没有了解清楚,你这种库的最大竞品就是 DRF 了吧,建议至少看看 drf 支持的功能。


    https://www.django-rest-framework.org/api-guide/filtering/

    drf 自带了排序、搜索、过滤

    这种基础的增删改查,drf 也支持完全 resful 的自带功能

    另外 drf 扩展起来也非常方便
    fy
        11
    fy  
    OP
       2021-04-19 11:19:01 +08:00
    @youngce

    原来还有这种操作,那这样说的话这个方向是没问题的。

    我不太了解 Django,刚看这文档的话,他是不是不支持各种算符啊?好像这篇文档只有这些:

    '^' Starts-with search.
    '=' Exact matches.
    '@' Full-text search. (Currently only supported Django's PostgreSQL backend.)
    '$' Regex search.
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1024 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 18:32 PVG 02:32 LAX 11:32 JFK 14:32
    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