基于 ASGI 的 Python 异步 web 框架 - 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
abersheeran
V2EX    Python

基于 ASGI 的 Python 异步 web 框架

  •  2
     
  •   abersheeran 2020-07-06 16:13:11 +08:00 4373 次点击
    这是一个创建于 1937 天前的主题,其中的信息可能已经有所发展或是发生改变。

    去年这个时候开始的想法,独立开发了一年,期间在公司的一些项目里也用上了。现在感觉可以见人了,欢迎大家来使用 & 喷我代码,也欢迎 ISSUE/PR 。

    https://github.com/abersheeran/index.py

    我开始开发 Index.py 的时候就一个目的不想再去折腾路由。然后才逐渐增加功能。

    功能和 FastAPI 高度重合,开发也几乎是同一时期……但我两肯定没抄对方的,我相信它的作者看不懂中文文档,我英文也挺菜的,FastAPI 没火之前我压根不知道还有人在弄类似的项目。

    不过大型项目肯定我比它快,因为我寻找路由是 O(1),其他基于 starlette 的框架都是 O(n)。说实话,Python 社区的 web 框架,路由系统全部用的遍历,不知道咋想的。我以前一直以为大家都是前缀树……

    总之希望大家有空来用用。

    39 条回复    2020-08-11 23:14:21 +08:00
    janxin
        1
    janxin  
       2020-07-06 16:15:01 +08:00
    这个名字 orz
    abersheeran
        2
    abersheeran  
    OP
       2020-07-06 16:15:46 +08:00
    @janxin hhh, 这个名字咋了
    huanglongtiankon
        3
    huanglongtiankon  
       2020-07-06 16:21:06 +08:00
    框架名字够直白的。。
    abersheeran
        4
    abersheeran  
    OP
       2020-07-06 16:22:02 +08:00
    @huanglongtiankon 哈哈哈。毕竟这是初衷,实在是厌恶了用代码搜索器去搜 url 的日子了。
    AilF
        5
    AilF  
       2020-07-06 16:29:37 +08:00
    已 star
    abersheeran
        6
    abersheeran  
    OP
       2020-07-06 16:31:23 +08:00
    @AilF 谢谢
    bnm965321
        7
    bnm965321  
       2020-07-06 16:37:37 +08:00   1
    那还是 Django 的方式好,在一个地方统一注册
    abersheeran
        8
    abersheeran  
    OP
       2020-07-06 16:40:14 +08:00
    @bnm965321 这个见仁见智。一个文件里配置 URL,如果路由有上千个(我主导开发过这个规模的项目),说实话,也挺难找的。后来我在 Django 里实现了一个类似的根据文件系统寻找路由的小程序,普遍反映找路由比以前快多了。
    bnm965321
        9
    bnm965321  
       2020-07-06 16:46:34 +08:00
    我个人不太喜欢一个路由放在一个文件,很多时候一些小的接口没必要。可以容忍一个文件 2500 以内
    79lawyer
        10
    79lawyer  
       2020-07-06 16:51:36 +08:00
    我以为连接是项目里的一个文件,没想到是真的叫这个名字啊哈哈哈哈
    abersheeran
        11
    abersheeran  
    OP
       2020-07-06 16:54:56 +08:00
    @xuqiccr 这个名字,一开始取的。后来发现项目名带 `.` 问题挺多的,现在也懒得改了就这样吧,至少名字能给人留下印象。
    xiaolinjia
        12
    xiaolinjia  
       2020-07-06 17:50:32 +08:00
    大概看了眼,主要区别就是把路由映射改成模板名字来映射?
    ReysC
        13
    ReysC  
       2020-07-06 17:56:09 +08:00
    收藏,后续看看代码。
    yzk66880
        14
    yzk66880  
       2020-07-06 18:11:42 +08:00
    赞一个
    ~
    Trim21
        15
    Trim21  
       2020-07-06 18:16:01 +08:00 via Android
    好!
    mwVYYA6
        16
    mwVYYA6  
       2020-07-06 19:01:54 +08:00
    这名字无敌,过目不忘 XD
    so1n
        17
    so1n  
       2020-07-06 19:19:24 +08:00 via Android
    收藏看路由实现……用 starlette 路由遍历真的好痛苦,加 Prometheus exporte 时,只能不去监控 /api/test/{id}类的路由
    abersheeran
        18
    abersheeran  
    OP
       2020-07-06 21:38:15 +08:00
    @so1n 路由实现就是借鉴的 PHP 思路啦。直接以文件相对路径作为 URL 。具体实现是利用了 Python 的模块特点。
    ericls
        19
    ericls  
       2020-07-06 22:40:15 +08:00
    我 18 年的时候也写了一个 https://github.com/ericls/PythonPlug
    ericls
        20
    ericls  
       2020-07-06 22:41:21 +08:00
    支持一下楼主
    viiii
        21
    viiii  
       2020-07-06 23:19:26 +08:00
    已 star 支持,
    说起 FastAPI,听说还不建议商用,没有成熟的 ORM 部分,不知道 LZ 这里是怎么搞的?

    要是有个实战项目来学一下就更好了
    ericls
        22
    ericls  
       2020-07-06 23:39:36 +08:00
    @viiii ORM 一般可以用外部的
    abersheeran
        23
    abersheeran  
    OP
       2020-07-06 23:57:57 +08:00
    @viiii 我们的项目使用的是 Mongodb,所以用的 motor + index.py 。我这个框架本身不带 ORM 的。
    mazhouliang
        24
    mazhouliang  
       2020-07-07 09:32:49 +08:00
    感觉名字真的很重要,楼主的这个名字有点像个练手项目
    whoami9894
        25
    whoami9894  
       2020-07-07 10:01:06 +08:00
    哈? Python Web 框架路由都是遍历吗?一直以为树形匹配是标配
    abersheeran
        26
    abersheeran  
    OP
       2020-07-07 14:18:42 +08:00
    @whoami9894 我之前也一直以为是前缀树。直到我真的看了源码
    abersheeran
        27
    abersheeran  
    OP
       2020-07-07 14:20:21 +08:00
    @mazhouliang 我觉得 starlette 这种名字更像练手……还有什么海象、龙卷风、独角兽啥的。
    abersheeran
        28
    abersheeran  
    OP
       2020-07-07 14:22:58 +08:00
    @ericls 谢谢啦。
    llsquaer
        29
    llsquaer  
       2020-07-08 10:06:13 +08:00
    先 star 看大神是怎么写框架的..
    so1n
        30
    so1n  
       2020-07-08 11:49:38 +08:00
    @viiii 一般不用 orm 哈哈哈哈哈哈哈哈哈哈哈 不过现在 asyncio 的 orm 有多个选择了 类 sqlalchemy 的是使用 databases+sqlalchemy,类 django 的是使用 tortoise-orm
    abersheeran
        31
    abersheeran  
    OP
       2020-07-08 14:07:57 +08:00
    @so1n databases 真的能用吗……我持怀疑态度。Tom 最近的工作重心在 drf 和 httpx 上,那些 starlette 周边他都不怎么维护了。tortoise-orm 倒是挺好用的,不过最近用 μmongo 多了些感悟,或许 ORM 不应该是 Django 那样。
    so1n
        32
    so1n  
       2020-07-08 14:15:42 +08:00
    @abersheeran mysql 目前用着没啥坑,他只提供一个语句执行,最大工作量都在 sqlalchemy 的生成 sql 语句
    abersheeran
        33
    abersheeran  
    OP
       2020-07-08 14:21:13 +08:00
    @so1n 原来如此。
    yzk66880
        34
    yzk66880  
       2020-07-08 21:32:45 +08:00
    @viiii encode/database,我实践过,用着还行,配合 sqlalchemy, 大致就是借助 sqlalchemy 生成一个 sql 指令扔给 database 去异步执行,自己写个类似 orm 的类就可。
    abersheeran
        35
    abersheeran  
    OP
       2020-07-08 23:38:18 +08:00
    @yzk66880 说实话,对 sqlalchemy 这种,一直觉得有些不好用。等我有空,找一个编译原理大佬一起来整一个我觉得更好的 ORM 。
    so1n
        36
    so1n  
       2020-07-28 09:53:19 +08:00
    可以问一下 文档是怎么生成的吗
    abersheeran
        37
    abersheeran  
    OP
       2020-07-28 11:44:01 +08:00
    @so1n 跟 fastapi 原理一样。
    so1n
        38
    so1n  
       2020-07-28 11:48:56 +08:00
    @abersheeran 我找不到关键词 我去仓库看看
    ixuuux
        39
    ixuuux  
       2020-08-11 23:14:21 +08:00 via iPhone
    @abersheeran 期待你的 orm
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2581 人在线   最高记录 6679       Select Language
    创工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 13:43 PVG 21:43 LAX 06:43 JFK 09:43
    Do have faith in what you're doing.
    ubao msn 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