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
V2EX  ›  Python

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

  •  
  •   Livid · 2019-11-07 01:21:06 +08:00 via iPhone · 10053 次点击
    这是一个创建于 1835 天前的主题,其中的信息可能已经有所发展或是发生改变。
    是否有什么大型的基于 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
       2019-11-07 02:35:29 +08:00
    @wph95 是啊。我就在想有没有类似 Sentry 这样规模的值得学习的项目。
    Livid
        3
    Livid  
    MOD
    OP
       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 😂我的错,刚睡醒眼睛没睁开。🤐
    wmc
        9
    wmc  
       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   ·   实用小工具   ·   5352 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 07:15 · PVG 15:15 · LAX 23:15 · JFK 02:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.