关于 Flask 项目的代码文件组织 - 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
Livid
59.8D
460.16D
V2EX    Python

关于 Flask 项目的代码文件组织

  •  
  •   Livid
    PRO
    2019-11-07 01:21:06 +08:00 via iPhone 10581 次点击
    这是一个创建于 2173 天前的主题,其中的信息可能已经有所发展或是发生改变。
    是否有什么大型的基于 Flask 框架的开源项目,想学习一下他们是如何组织代码的。
    第 1 条附言    2022-01-30 22:21:49 +08:00
    V2EX 后面把一些功能拆了出来,单独做了一个服务,跑在 Python 3 的容器里:

    V2EX Remote Worker

    https://github.com/v2ex/remote
    49 条回复    2020-07-18 00:05:54 +08:00
    wph95
        1
    wph95  
       2019-11-07 02:33:24 +08:00 via iPad
    Airflow 当初看过一些 感觉还可以
    // 要是问 Django 就好了 有好几个写的很优雅的大项目( sentry taigo)非常值得推荐
    Livid
        2
    Livid  
    MOD
    OP
    PRO
       2019-11-07 02:35:29 +08:00
    @wph95 是啊。我就在想有没有类似 Sentry 这样规模的值得学习的项目。
    Livid
        3
    Livid  
    MOD
    OP
    PRO
       2019-11-07 06:52:45 +08:00
    官方文档其实有提到一个 pattern:

    http://flask.palletsprojects.com/en/1.1.x/patterns/packages/
    memorybox
        4
    memorybox  
       2019-11-07 07:23:13 +08:00   3
    一个提供 restapi 的示例,组织很简洁,有参考价值:

    https://github.com/frol/flask-restplus-server-example
    haoji
        5
    haoji  
       2019-11-07 07:32:21 +08:00 via Android
    @wph95 别说一半不说了嘛,推荐一下?
    phy25
        6
    phy25  
       2019-11-07 07:45:53 +08:00 via Android
    @haoji #5 括号里的不是吗。
    haoji
        8
    haoji  
       2019-11-07 08:12:51 +08:00 via Android
    @phy25 我的错,刚睡醒眼睛没睁开。
    39Sc06lk7Khhc4qV
        9
    39Sc06lk7Khhc4qV  
       2019-11-07 08:29:03 +08:00   1
    想起之前实习的时候读到的一篇文章,用一个很 trick 的方法来解决循环引用…… 这个设计很巧,实际上把所有的模块都做成了 init_app

    https://lepture.com/en/2018/structure-of-a-flask-project
    Latin
        10
    Latin  
       2019-11-07 08:43:46 +08:00   1
    banxi1988
        11
    banxi1988  
       2019-11-07 08:51:05 +08:00   1
    嗯, 搭车问一下,现在用 FastAPI 的人多吗? 一个类似 Flask 的框架.
    但是比 Flask 更现代:
    1. Python 3.6+
    2. 完善的类型声明
    3. 异步 async await 支持
    4. 自带 Swagger (OpenApi)
    Allianzcortex
        12
    Allianzcortex  
       2019-11-07 08:51:11 +08:00   2
    @wmc 提到的 @lepture 曾经写过一个论坛 june,对里面装饰器来控制权限的用法至今还印象深刻,当然毕竟他就是 pocoo 组(Flask 核心开发)里的一员

    https://gist.github.com/Allianzcortex/374f3713ac3e0b898e978b0850865bb1
    cz5424
        13
    cz5424  
       2019-11-07 09:12:13 +08:00 via iPhone   1
    Orenoid
        14
    Orenoid  
       2019-11-07 09:13:37 +08:00   1
    我是参照了这两个项目,可能都谈不上大型。
    狗书的 flasky,也就是 7 楼提的那个:
    https://github.com/miguelgrinberg/flasky/tree/60252375f8660d034680725db24301c594ce69e4
    flask 官方 repo 里的 tutorial:
    https://github.com/pallets/flask/tree/master/examples/tutorial
    两者用的都是类似的项目结构,flasky 把 turorial 里的一些单文件扩展成了包,但基本架构没太大差别。
    Orenoid
        15
    Orenoid  
       2019-11-07 09:16:59 +08:00
    @Orenoid #14 更正,flasky 跟 7 楼的不是同一个项目,只是同一个作者
    ebingtel
        16
    ebingtel  
       2019-11-07 09:17:55 +08:00
    怎么开心怎么来,都是微服务了……一个 web 项目也可以 install 其他的子项目作为集成
    sujin190
        17
    sujin190  
       2019-11-07 09:25:46 +08:00
    676529483
        18
    676529483  
       2019-11-07 09:49:52 +08:00
    感觉 flask 一直都是关注度高,但开源的大型项目找不到,相反 django 就很多了。根据面试的情况归纳,基本小企业跟风用 flask 的多一些,做的也比较小型
    cpj
        19
    cpj  
       2019-11-07 09:56:36 +08:00
    老帖子里有提到过,并且我实践了 lepture 的那篇文章 ( https://lepture.com/en/2018/structure-of-a-flask-project ),感觉比较舒服
    ClericPy
        20
    ClericPy  
       2019-11-07 09:58:51 +08:00
    早年间用的 https://exploreflask.com/en/latest/organizing.html, 虽然也有中文版教程
    不过楼主这种站长经验丰富的应该不需要这个...

    用了两年 flask, 我就跳 asgi 了, starlette / fastapi 真香, falcon 也真快
    est
        21
    est  
       2019-11-07 10:05:59 +08:00   5
    flask 有很多 anti-pattern。

    网上抄的装饰器一时爽,单元测试火葬场。
    全局 context 变量一时爽,堆栈弹错火葬场。
    flask API 输出一时爽,代码组织火葬场。
    简单功能一时爽,flask-* 插件火葬场
    flask-*插件一时爽,遇到 bug 兼容问题火葬场
    Hopetree
        22
    Hopetree  
       2019-11-07 10:42:04 +08:00
    把所有的 APP 都使用 init_app ()加载,我觉得这就是 flask 的组织架构了
    lolizeppelin
        23
    lolizeppelin  
       2019-11-07 10:43:48 +08:00
    想看大型的就不要把关注点放在 web 框架上...

    来来来 openstack 走起
    GoLand
        24
    GoLand  
       2019-11-07 10:50:54 +08:00
    https://github.com/Robpol86/Flask-Large-Application-Example

    有个这个,很不错,一直在用。
    gjquoiai
        25
    gjquoiai  
       2019-11-07 10:53:01 +08:00
    XIVN1987
        26
    XIVN1987  
       2019-11-07 10:53:34 +08:00
    @est
    看来还是 django 靠谱啊,,
    hmxxmh
        27
    hmxxmh  
       2019-11-07 11:04:05 +08:00
    @banxi1988 类型注解只能声明一些常用的数据类型吧,如果是 file 类型和 QuerySet 对象应该怎么声明
    est
        28
    est  
       2019-11-07 11:13:19 +08:00   2
    @XIVN1987 烧火棍有烧火棍的用处,航母有航母的战斗力。要把烧火棍变成航母,得有规划和变通能力。要把航母当烧火棍使,得会法术和本事。
    skenan
        29
    skenan  
       2019-11-07 12:41:42 +08:00
    现在用 flask 一般是写 api 吧,比较喜欢这个 repo 里的组织方式: https://github.com/openspug/spug
    Trim21
        30
    Trim21  
       2019-11-07 12:44:13 +08:00 via iPhone
    fastapi 真香
    ampedee
        31
    ampedee  
       2019-11-07 12:51:32 +08:00 via Android
    @banxi1988 FastAPI 真香
    Trim21
        32
    Trim21  
       2019-11-07 13:01:51 +08:00 via Android
    @hmxxmh 不完全是用的类型注解,还可以用函数参数默认值来声明。上传文件是通过参数默认值声明的。
    anaf
        33
    anaf  
       2019-11-07 14:00:36 +08:00
    cookiecutter-flask 一直以来用这个
    Aether
        34
    Aether  
       2019-11-07 19:31:55 +08:00
    @est 之前用过一段时间 flask,现在转到 Go 下面,最开始很痛苦,现在觉得没有环境问题啥的各种爽……
    est
        35
    est  
       2019-11-07 21:46:53 +08:00
    @Aether 环境问题是指 py 版本和依赖包么?那的确很蛋痛。

    不过 go 一般都配合 docker 运行了。反而也麻烦。
    shisang
        36
    shisang  
       2019-11-07 23:49:49 +08:00
    shisang
        37
    shisang  
       2019-11-07 23:51:11 +08:00
    kayseen
        38
    kayseen  
       2019-11-13 19:28:44 +08:00
    @wph95
    话说,你有哪些优秀的 django 项目啊,可以分享一下不?
    (相信大家都想学习下)
    stdout
        39
    stdout  
       2019-11-14 09:08:57 +08:00
    @banxi1988 试试 connexion 这个,应当完全满足你
    stdout
        40
    stdout  
       2019-11-14 09:09:42 +08:00
    matrix1010
        41
    matrix1010  
       2019-11-14 11:00:17 +08:00 via Android
    wzw
        42
    wzw  
       2020-01-20 15:27:26 +08:00
    @ClericPy #20
    @Trim21 #30
    @banxi1988 #11
    @ampedee #31

    fastapi 我也想试试了, 请问如何关闭 /docs 这个, 要不然上线后, 接口一目了然呀
    Trim21
        43
    Trim21  
       2020-01-20 15:44:22 +08:00 via iPhone
    @wzw 把 app 初始化时候的对应参数传 None
    Trim21
        44
    Trim21  
       2020-01-20 15:47:49 +08:00 via iPhone
    @est 依赖问题用 python-poetry 就好了,会自动解决潜在以来可能出现的冲突
    ClericPy
        45
    ClericPy  
       2020-01-20 18:05:47 +08:00
    @wzw #42 测试环境关闭, 线上环境开着就行吧, 简单地在不同环境上配置参数集里带上是否开 docs

    https://fastapi.tiangolo.com/tutorial/application-configuration/#docs-urls

    以前考虑给 docs 加 Oauth, 后来发现, 内网测试环境看就够了, 外网看个屁... 就简单多了
    wzw
        46
    wzw  
       2020-01-20 21:55:42 +08:00 via iPhone
    @ClericPy 谢谢,是不是 fastapi 非常值得试试。
    ClericPy
        47
    ClericPy  
       2020-01-20 23:33:05 +08:00
    @wzw #46 python2 都死了, 还不赶紧上 ASGI 的车[狗头保命], Django 家的 ASGI 也是很不错的

    早年间我是 Bottle 无痛转 flask, 被 Sanic 坑了一段跳了 responder, 然后上了 K 神的当, 直接用它依赖的 starlette, 最后无痛转 fastapi, 连 blacksheep 的作者都被 fastapi 吸引了

    PS: Cython 加速下, falcon 和它的 ASGI 版本 hug 性能都逼近 golang 了, 追求极限性能也可以考虑下, 至于 vibora 什么的更极限性能的, 就是蹭热度玩噱头的, 生产环境不敢上, 给它们修 bug 的时间够我学 golang 去了
    johnsona
        48
    johnsona  
       2020-07-17 16:35:57 +08:00
    @skenan 这个项目结构就是抄袭 django 的
    skenan
        49
    skenan  
       2020-07-18 00:05:54 +08:00 via iPhone
    @jsisjs20130824 之前是用 flask 写的,第二版切换成 django 了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     898 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 22:15 PVG 06:15 LAX 15:15 JFK 18:15
    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