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 · 3885 次点击
    这是一个创建于 1637 天前的主题,其中的信息可能已经有所发展或是发生改变。

    去年这个时候开始的想法,独立开发了一年,期间在公司的一些项目里也用上了。现在感觉可以见人了,欢迎大家来使用 & 喷我代码,也欢迎 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 以内
    xuqiccr
        10
    xuqiccr  
       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   ·   实用小工具   ·   4223 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 322ms · UTC 04:09 · PVG 12:09 · LAX 20:09 · JFK 23:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.