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

有没有人觉得 Python Flask 写后端很难用?

  •  
  •   SystemLight ·
    SystemLight · 2021-08-23 16:10:02 +08:00 · 7642 次点击
    这是一个创建于 1221 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 自我感觉 python 越用越难用,动态类型提示极其的不友好
    • flask 集成 sqlalchemy 想要返回 JSON 返回内容还需要通过 marshmallow 等把 python 对象转换
    • 如果想要使用登录管理集成 flask_login 等
    • 这样就会出现项目中存在多个模型定义文件
    • 再说 sqlalchemy 本身就挺复杂,然后类型提示大部分都没用,想不起来时候只能查文档,非常繁琐
    • 还有 flaks 本身导入通过一个全局 app 控制,这样进行项目分块时候极其不友好,有蓝图也一样,对比 dotnent 和 java 自识别,flask 需要手动注册就很麻烦了
    • 然后我总结一句就是,动态语言一时爽,过一段时间自己都不知道这个变量会产生什么结果类型
    66 条回复    2021-09-11 16:59:25 +08:00
    wellsc
        1
    wellsc  
       2021-08-23 16:10:39 +08:00
    2021 年了
    tinytoadd
        2
    tinytoadd  
       2021-08-23 16:12:46 +08:00 via Android
    使用过一次后,就再也没用过了
    ytmsdy
        3
    ytmsdy  
       2021-08-23 16:18:26 +08:00   ❤️ 13
    动态语言好比一辆 F1 赛车,一脚油门一踩就往前走,但是相应的如果技术不过硬,过弯和减速的时候容易出问题。
    老司机们都觉得非常香。
    新司机觉得这什么破车,居然不带 ABS,还没有倒挡!
    chenqh
        4
    chenqh  
       2021-08-23 16:18:45 +08:00
    感觉还好吧, 手动注册还行吧, 手动注册好理解.
    chenqh
        5
    chenqh  
       2021-08-23 16:20:15 +08:00   ❤️ 1
    关键 web 一般而言操作比较简单吧,一般的 crud, 基本不需要定义中间类,导致要了解的额外内容较少, 比较简单
    chenqh
        6
    chenqh  
       2021-08-23 16:21:23 +08:00
    顺便说一局,我用的 tornado, flask 要用 gevent, 我菜我把握不了
    Mohanson
        7
    Mohanson  
       2021-08-23 16:23:13 +08:00   ❤️ 1
    关于我是如何评价 py 这门语言的: 看我头像
    alexkkaa
        8
    alexkkaa  
       2021-08-23 16:23:43 +08:00 via Android   ❤️ 1
    flask 就是用来写 hello world 的 用来写项目最后会改的不牛不马的。Django 是比较完善的
    sickoo
        9
    sickoo  
       2021-08-23 16:25:01 +08:00
    推荐 fastapi,高性能异步框架,如果还不行请 fast 自己
    xmt328
        10
    xmt328  
       2021-08-23 16:26:58 +08:00   ❤️ 4
    @ytmsdy 然后项目经理说这个项目你帮客户把乡下老母亲接过来,别人拖拉机 1 个小时就能来回,你 F1 的赛车手半个小时应该足够了吧
    steptodream
        11
    steptodream  
       2021-08-23 16:41:57 +08:00
    合适的工具干合适的事
    jakehu
        12
    jakehu  
       2021-08-23 16:42:06 +08:00
    sanic 还不错
    so1n
        13
    so1n  
       2021-08-23 16:43:21 +08:00
    类型这个可以用 type hint
    so1n
        14
    so1n  
       2021-08-23 16:44:58 +08:00
    @sickoo fastapi 是基于 starlette, 性能全靠自己的虚假宣传, 还不如 starlette. 宣传的性能是基于 uvicorn+uvloop+ojson+h11
    tabris17
        15
    tabris17  
       2021-08-23 16:45:10 +08:00
    @jakehu sanic 还活跃吗?基础设施太少了,不知道现在如何了
    ytmsdy
        16
    ytmsdy  
       2021-08-23 16:46:42 +08:00
    @xmt328 可以啊,让项目经理先把去向下的高速公路修好!
    Vegetable
        17
    Vegetable  
       2021-08-23 16:49:28 +08:00
    Django yyds
    ila
        18
    ila  
       2021-08-23 16:52:03 +08:00
    又不是不能用。。。



    其实你写多了,积累多了,自定义 model 基类和中间件,能够解决很多问题。
    jakehu
        19
    jakehu  
       2021-08-23 16:54:21 +08:00
    @tabris17 flask 之前也是用过的,现在在用 sanic 写一个项目,感觉还可以给
    chenqh
        20
    chenqh  
       2021-08-23 16:55:58 +08:00
    @Mohanson 我到觉得脚本语言里面 py,语法还好,虽然现在脚本里面 js 语法最好,但是好的是应该是 ts
    danc
        21
    danc  
       2021-08-23 16:56:24 +08:00
    写惯了静态类型的,这种动态类型的我是真的 hold 不住了🤣。一开始写的时候其实还好,后面过了一段时间要改的话,尤其是范围稍微大一点,直接火葬场
    youngce
        22
    youngce  
       2021-08-23 17:00:30 +08:00
    既然这么不喜欢 flask 的简陋,为啥不选 django 呢。

    ps:fastapi 不是比 flask 生态更差?不知道为什么这么多推荐的
    chenqh
        23
    chenqh  
       2021-08-23 17:01:50 +08:00
    @youngce django 上手比 flask 难呀
    Latin
        24
    Latin  
       2021-08-23 17:02:03 +08:00
    题主的目标就是引战么?
    lgpqdwjh
        25
    lgpqdwjh  
       2021-08-23 17:41:20 +08:00
    首先这是一个引战帖

    然后我想说,flask 和 fastapi 压根就不是一类东西, 没有可比性

    至于你觉得 flask 写后端很难用, 大概率是你自己的问题
    kaka6
        26
    kaka6  
       2021-08-23 17:50:23 +08:00
    flask 写后端挺好用的,简单便捷,好扩展
    SjwNo1
        27
    SjwNo1  
       2021-08-23 18:25:57 +08:00
    求求你用 java 吧
    roundgis
        28
    roundgis  
       2021-08-23 18:29:15 +08:00 via Android
    找一個好點的 ide

    例如 pycharm

    日子會好過些
    est
        29
    est  
       2021-08-23 18:30:53 +08:00
    flask 本来就很难用。就是一个写 hello world 的脚手架
    CicadaLewis
        30
    CicadaLewis  
       2021-08-23 18:32:50 +08:00
    type hint 了解一下
    lesismal
        31
    lesismal  
       2021-08-23 18:34:41 +08:00
    golang,你值得拥有
    leonme
        32
    leonme  
       2021-08-23 18:43:52 +08:00 via iPhone
    python 本身就很拉跨,和 flask 无关
    fatbear
        33
    fatbear  
       2021-08-23 19:02:35 +08:00   ❤️ 2
    楼主吐槽主要集中在两点,一个是动态类型的问题,这不是 flask 的问题,是 python 的问题,现在 python3 有了类型注解,和 ide 集成的也很好,并不存在没有提示等问题。 第二,楼主一直觉得 sqlalchemy 难用,flask 比 django 就好用在每个组件都可以自由替换,你可以选择 peewee,序列为 json 只需要一句 query.dicts()。
    很多人去用其他语言的 xx 框架难用其实就是先入为主了,用其他语言的思想去看待另一门语言,python 的优势就在于快速开发,快速迭代,如果作为内部工具的后端服务,这两个优势是其他语言无可比拟的
    Kilerd
        34
    Kilerd  
       2021-08-23 19:15:24 +08:00 via iPhone   ❤️ 2
    哪哪都能看到说 flask 和 fastapi 不是同一个东西的人,别人明明就想用 python 写个 API 。然后你就给讲到了什么封装,什么架构能力不对称。哎
    loading
        35
    loading  
       2021-08-23 19:19:57 +08:00
    flask 基本就是用来学 hello world 的,复杂应用超级麻烦。
    letking
        36
    letking  
       2021-08-23 19:28:34 +08:00
    楼主引战有一手,学习了。
    efaun
        37
    efaun  
       2021-08-23 21:08:45 +08:00
    @Kilerd #34 一个东西看起来像鸭子,吃起来像鸭子,那它就是鸭子,你但凡正眼看下小丑,那你就输了
    yohole
        38
    yohole  
       2021-08-23 23:12:49 +08:00
    我一个写了多年 java 的人,用 python 写 web 就真的很别扭,不管用 python 什么框架都一样,直到用上 PyCharm 才好过了一点点,python 的特点就是写那些几十行最多几百行的工具时候,非常爽和快
    RockShake
        39
    RockShake  
       2021-08-24 08:39:23 +08:00
    目前也就 Django 无论文档还是生态完整
    ospider
        40
    ospider  
       2021-08-24 09:21:52 +08:00
    我就不知道 flask 社区对 fastapi 咋就这么大的敌意?看来是真的戳到痛处了? FastAPI 人家大大方方的在主页写着基于 starlette 和 pydantic,咋就让你们你说的好像是偷源码一样了?人家 starlette 开源不就是为了让别人复用么?

    楼主说的这几点,FastAPI 可以解决不少,建议尝试一下:
    1. FastAPI 基于 Pydantic,强制你把参数都加上 type hint,一定程度上缓解了动态类型的问题。
    2. FastAPI 中使用 Pydantic 定义参数,SQLAlchemy 定义数据库模型,个人使用下来感觉还是比较顺畅的。出参入参和模型中的字段还是有差异的,区别开有意义。不过 Pydantic 有 ORM mode,也可以直接读取 SQLAlchemy model 。
    3. FastAPI 有强大的依赖注入系统,像是登录这种操作,直接写个几行的依赖就好了。社区有 fastapi_user/login 这种插件,但是我觉得是脱裤子放屁。官方文档就有详尽的实现 oauth2 的教程。
    4. SQLAlchemy 的类型提示有时候真是无解……太动态了。
    5. FastAPI 也是全局一个 app/router,然后其他的 router 注册上去。。不过最后在自动生成的 swagger 文档里是统一的

    总之,如果尝试写前后端分离的 SPA 的话,建议试一下 FastAPI,毕竟刚用起来的 Flask 非常像,学习成本很低。
    qW7bo2FbzbC0
        41
    qW7bo2FbzbC0  
       2021-08-24 10:33:33 +08:00
    写 helloworld 的话,试试 bottle.py
    wangyzj
        42
    wangyzj  
       2021-08-24 10:34:13 +08:00
    怎么说的
    python 什么都能干
    但有些工作有更好的选择
    比如写 web
    flask,django 各自有各自的优点和缺点
    虽然我更喜欢 flask,django 太臃肿
    但是做一个对性能要求不高的能用的需要团队协作的东西的话,django 是真的成熟完善
    qq976739120
        43
    qq976739120  
       2021-08-24 11:04:32 +08:00
    flask 就是给老司机或者创业公司快速启动用的,提供个简单封装就够了.新手还是学学 spring 之类的比较好
    vanwtf
        44
    vanwtf  
       2021-08-24 11:10:40 +08:00
    前期写一些管理系统的项目都是 django 一把搓,flask 写的项目大了就感觉用起来麻烦了,写点小接口还好,django yyds
    stach
        45
    stach  
       2021-08-24 11:12:23 +08:00
    楼主的焦点更多的是 python 是一门 `动态` 语言, 如果要解决这个问题, 考虑 `静态` 语言会更好, 比如 Go 就很不错.

    另外, Flask 写后端是体验是非常好的, 觉得复杂的话, 可以不用 sqlalchemy, 直接用 PyMysql.
    我个人使用 Flask 本身的组件就很少, 主要是冲着 Python 这个语言优势去的, 再配上 gevent, 性能也够用.
    写过的业务也非常复杂, 可读性非常好, 如果用 Go 写就差一点了.

    个人认为, Flask 的优势在于它简单, 其实, 你可以改造成你想要的样子, 你习惯的姿势, 而改造没有啥成本.
    我可以像写 Go 后端 connection-per-goroutine 这样写 Python 后端 connection-per-gevent.
    这个 Tornado, Django 对于我个人而言就是难用.

    人生苦短, Python 真的不错, Flask 只是个工具.
    Mark24
        47
    Mark24  
       2021-08-24 11:49:01 +08:00
    楼主没有领会动态语言的精髓。
    SystemLight
        48
    SystemLight  
    OP
       2021-08-24 13:07:15 +08:00
    @yohole 没错小型的项目用起来非常爽,快速开发,但是项目复杂度一旦上来,自己写着写着都忘记这个变量什么类型的了,虽然有 typing 辅助,但是有些库太魔法了,导致类型都无法提示出来了。
    SystemLight
        49
    SystemLight  
    OP
       2021-08-24 13:08:03 +08:00
    @SjwNo1 正在学习 spring 全家桶,从 tornado 到 flask,到现在不想用 python 都是泪,哈哈
    SystemLight
        50
    SystemLight  
    OP
       2021-08-24 13:18:04 +08:00
    @ospider 听起来不错,可以尝试,SQLAlchemy 动态的简直了,.半天出不来提示,太不友好了
    jiayong2793
        51
    jiayong2793  
       2021-08-24 13:59:18 +08:00
    @ytmsdy 你这个比如反了吧,动态语言数据没定义类型就拿来用,写完之后连自己都不知道是什么类型的
    meiyoumingzi6
        52
    meiyoumingzi6  
       2021-08-24 20:33:43 +08:00
    别的还好, 就是觉得 current_app 非常蛋疼, 我只想在非请求周期内用个 setting
    lanlanye
        53
    lanlanye  
       2021-08-24 22:47:58 +08:00
    最近写服务用 Golang,写业务用 Django,爽的一批
    molika
        54
    molika  
       2021-08-25 09:38:59 +08:00
    别的不说 就说第一点 “自我感觉 python 越用越难用,动态类型提示极其的不友好” 自己写代码不随手 type hint 然后推导不出类型。。。怪 python 喽
    SystemLight
        55
    SystemLight  
    OP
       2021-08-25 15:55:32 +08:00
    @molika 用一下 sqlalchemy 就知道了,第三库内置的实现非常动态,导致无法提示
    molika
        56
    molika  
       2021-08-26 00:11:29 +08:00 via iPhone
    @SystemLight 合适的 orm 的确难找 自己 hack 写方法包 加泛型 能推出来 我都这么干 但是没办法
    allisone
        57
    allisone  
       2021-08-26 10:14:25 +08:00
    用 django 一把梭
    flniu
        58
    flniu  
       2021-08-26 10:47:58 +08:00
    @ytmsdy 哥们你说的应该是卡丁车。F1 有离合器、档位,肯定不是一踩油门就走,也有倒档,没有 TCS/ABS 倒是真的。
    flniu
        59
    flniu  
       2021-08-26 11:03:26 +08:00
    我们的经验是:强制加类型提示,用 mypy 做类型检查(可以加到 pre-commit 或 /和 CI )。
    另外也在用 black 做代码格式化,用 pylint 或 flake8 做风格检查。
    这样综合起来,代码的可维护性会好很多。
    xmt328
        60
    xmt328  
       2021-08-26 15:05:47 +08:00
    @molika 这个我就不能理解了,那干嘛不选个强类型语言
    williamZXS
        61
    williamZXS  
       2021-08-26 21:20:10 +08:00
    @yohole 确实,我是先写的 python,后来才写 java,觉得 python 写个脚本很顺手,用来写项目会比较乱
    l4ever
        62
    l4ever  
       2021-08-28 15:58:51 +08:00   ❤️ 1
    看到了这个`flask 集成 sqlalchemy 想要返回 JSON 返回内容还需要通过 marshmallow 等把 python 对象转换`
    我给你个方案 https://paste.ubuntu.org.cn/4544492
    molika
        63
    molika  
       2021-09-01 16:38:05 +08:00
    @xmt328 typehint 可能是某些特殊场景或者人的需求 我目前不太需要这个
    可能后面需要考虑这方面了 会迁移过去 (我自己一个人的项目 hold 住 而且 hack 三方库也很方便
    tisswb
        64
    tisswb  
       2021-09-02 17:06:31 +08:00
    sqlalchemy 很强大,我一般都是用 pony orm
    wuwukai007
        65
    wuwukai007  
       2021-09-02 17:10:12 +08:00
    flask create_all 建表还要先手动导入模型类,一个项目几百张表,很离谱!
    SystemLight
        66
    SystemLight  
    OP
       2021-09-11 16:59:25 +08:00
    @wuwukai007 有 flask-sqlacodegen 可以反向生成模型
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2970 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 14:40 · PVG 22:40 · LAX 06:40 · JFK 09:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.