推荐学习书目
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 · Jul 6, 2020 · 4763 views
    This topic created in 2136 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

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

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