3

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

 3 years ago
source link: https://www.v2ex.com/t/797493
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

V2EX  ›  Python

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

  SystemLight · SystemLight · 2 天前 · 3337 次点击
  • 自我感觉 python 越用越难用,动态类型提示极其的不友好
  • flask 集成 sqlalchemy 想要返回 JSON 返回内容还需要通过 marshmallow 等把 python 对象转换
  • 如果想要使用登录管理集成 flask_login 等
  • 这样就会出现项目中存在多个模型定义文件
  • 再说 sqlalchemy 本身就挺复杂,然后类型提示大部分都没用,想不起来时候只能查文档,非常繁琐
  • 还有 flaks 本身导入通过一个全局 app 控制,这样进行项目分块时候极其不友好,有蓝图也一样,对比 dotnent 和 java 自识别,flask 需要手动注册就很麻烦了
  • 然后我总结一句就是,动态语言一时爽,过一段时间自己都不知道这个变量会产生什么结果类型
59 条回复    2021-08-26 11:03:26 +08:00

wellsc

wellsc   2 天前

2021 年了

tinytoadd

tinytoadd   2 天前 via Android

使用过一次后,就再也没用过了

ytmsdy

ytmsdy   2 天前   ❤️ 11

动态语言好比一辆 F1 赛车,一脚油门一踩就往前走,但是相应的如果技术不过硬,过弯和减速的时候容易出问题。
老司机们都觉得非常香。
新司机觉得这什么破车,居然不带 ABS,还没有倒挡!

chenqh

chenqh   2 天前

感觉还好吧, 手动注册还行吧, 手动注册好理解.

chenqh

chenqh   2 天前   ❤️ 1

关键 web 一般而言操作比较简单吧,一般的 crud, 基本不需要定义中间类,导致要了解的额外内容较少, 比较简单

chenqh

chenqh   2 天前

顺便说一局,我用的 tornado, flask 要用 gevent, 我菜我把握不了

Mohanson

Mohanson   2 天前   ❤️ 1

关于我是如何评价 py 这门语言的: 看我头像

alexkkaa

alexkkaa   2 天前 via Android

flask 就是用来写 hello world 的 用来写项目最后会改的不牛不马的。Django 是比较完善的

sickoo

sickoo   2 天前

推荐 fastapi,高性能异步框架,如果还不行请 fast 自己

xmt328

xmt328   2 天前   ❤️ 4

@ytmsdy 然后项目经理说这个项目你帮客户把乡下老母亲接过来,别人拖拉机 1 个小时就能来回,你 F1 的赛车手半个小时应该足够了吧

steptodream

steptodream   2 天前

合适的工具干合适的事

jakehu

jakehu   2 天前

sanic 还不错

so1n

so1n   2 天前

类型这个可以用 type hint

so1n

so1n   2 天前

@sickoo fastapi 是基于 starlette, 性能全靠自己的虚假宣传, 还不如 starlette. 宣传的性能是基于 uvicorn+uvloop+ojson+h11

tabris17

tabris17   2 天前

@jakehu sanic 还活跃吗?基础设施太少了,不知道现在如何了

ytmsdy

ytmsdy   2 天前

@xmt328 可以啊,让项目经理先把去向下的高速公路修好!

Vegetable

Vegetable   2 天前

Django yyds

ila

ila   2 天前

又不是不能用。。。

其实你写多了,积累多了,自定义 model 基类和中间件,能够解决很多问题。

jakehu

jakehu   2 天前

@tabris17 flask 之前也是用过的,现在在用 sanic 写一个项目,感觉还可以给

chenqh

chenqh   2 天前

@Mohanson 我到觉得脚本语言里面 py,语法还好,虽然现在脚本里面 js 语法最好,但是好的是应该是 ts

danc

danc   2 天前

写惯了静态类型的,这种动态类型的我是真的 hold 不住了🤣。一开始写的时候其实还好,后面过了一段时间要改的话,尤其是范围稍微大一点,直接火葬场

youngce

youngce   2 天前

既然这么不喜欢 flask 的简陋,为啥不选 django 呢。

ps:fastapi 不是比 flask 生态更差?不知道为什么这么多推荐的

chenqh

chenqh   2 天前

@youngce django 上手比 flask 难呀

Latin

Latin   2 天前

题主的目标就是引战么?

lgpqdwjh

lgpqdwjh   2 天前

首先这是一个引战帖

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

至于你觉得 flask 写后端很难用, 大概率是你自己的问题

kaka6

kaka6   2 天前

flask 写后端挺好用的,简单便捷,好扩展

SjwNo1

SjwNo1   2 天前

求求你用 java 吧

roundgis

roundgis   2 天前 via Android

找一個好點的 ide

例如 pycharm

日子會好過些

est

est   2 天前

flask 本来就很难用。就是一个写 hello world 的脚手架

CicadaLewis

CicadaLewis   2 天前

type hint 了解一下

lesismal

lesismal   2 天前

golang,你值得拥有

leonme

leonme   2 天前 via iPhone

python 本身就很拉跨,和 flask 无关

fatbear

fatbear   2 天前   ❤️ 2

楼主吐槽主要集中在两点,一个是动态类型的问题,这不是 flask 的问题,是 python 的问题,现在 python3 有了类型注解,和 ide 集成的也很好,并不存在没有提示等问题。 第二,楼主一直觉得 sqlalchemy 难用,flask 比 django 就好用在每个组件都可以自由替换,你可以选择 peewee,序列为 json 只需要一句 query.dicts()。
很多人去用其他语言的 xx 框架难用其实就是先入为主了,用其他语言的思想去看待另一门语言,python 的优势就在于快速开发,快速迭代,如果作为内部工具的后端服务,这两个优势是其他语言无可比拟的

Kilerd

Kilerd   2 天前 via iPhone   ❤️ 2

哪哪都能看到说 flask 和 fastapi 不是同一个东西的人,别人明明就想用 python 写个 API 。然后你就给讲到了什么封装,什么架构能力不对称。哎

loading

loading   2 天前

flask 基本就是用来学 hello world 的,复杂应用超级麻烦。

letking

letking   2 天前

楼主引战有一手,学习了。

efaun

efaun   2 天前

@Kilerd #34 一个东西看起来像鸭子,吃起来像鸭子,那它就是鸭子,你但凡正眼看下小丑,那你就输了

yohole

yohole   2 天前

我一个写了多年 java 的人,用 python 写 web 就真的很别扭,不管用 python 什么框架都一样,直到用上 PyCharm 才好过了一点点,python 的特点就是写那些几十行最多几百行的工具时候,非常爽和快

RockShake

RockShake   2 天前

目前也就 Django 无论文档还是生态完整

ospider

ospider   2 天前

我就不知道 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 非常像,学习成本很低。

wangyzj

wangyzj   2 天前

怎么说的
python 什么都能干
但有些工作有更好的选择
比如写 web
flask,django 各自有各自的优点和缺点
虽然我更喜欢 flask,django 太臃肿
但是做一个对性能要求不高的能用的需要团队协作的东西的话,django 是真的成熟完善

qq976739120

qq976739120   2 天前

flask 就是给老司机或者创业公司快速启动用的,提供个简单封装就够了.新手还是学学 spring 之类的比较好

vanwtf

vanwtf   2 天前

前期写一些管理系统的项目都是 django 一把搓,flask 写的项目大了就感觉用起来麻烦了,写点小接口还好,django yyds

stach

stach   2 天前

楼主的焦点更多的是 python 是一门 `动态` 语言, 如果要解决这个问题, 考虑 `静态` 语言会更好, 比如 Go 就很不错.

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

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

人生苦短, Python 真的不错, Flask 只是个工具.

Mark24

Mark24   2 天前

楼主没有领会动态语言的精髓。

SystemLight

SystemLight   2 天前

@yohole 没错小型的项目用起来非常爽,快速开发,但是项目复杂度一旦上来,自己写着写着都忘记这个变量什么类型的了,虽然有 typing 辅助,但是有些库太魔法了,导致类型都无法提示出来了。

SystemLight

SystemLight   2 天前

@SjwNo1 正在学习 spring 全家桶,从 tornado 到 flask,到现在不想用 python 都是泪,哈哈

SystemLight

SystemLight   2 天前

@ospider 听起来不错,可以尝试,SQLAlchemy 动态的简直了,.半天出不来提示,太不友好了

jiayong2793

jiayong2793   2 天前

@ytmsdy 你这个比如反了吧,动态语言数据没定义类型就拿来用,写完之后连自己都不知道是什么类型的

meiyoumingzi6

meiyoumingzi6   1 天前

别的还好, 就是觉得 current_app 非常蛋疼, 我只想在非请求周期内用个 setting

lanlanye

lanlanye   1 天前

最近写服务用 Golang,写业务用 Django,爽的一批

molika

molika   1 天前

别的不说 就说第一点 “自我感觉 python 越用越难用,动态类型提示极其的不友好” 自己写代码不随手 type hint 然后推导不出类型。。。怪 python 喽

SystemLight

SystemLight   23 小时 0 分钟前

@molika 用一下 sqlalchemy 就知道了,第三库内置的实现非常动态,导致无法提示

molika

molika   14 小时 44 分钟前 via iPhone

@SystemLight 合适的 orm 的确难找 自己 hack 写方法包 加泛型 能推出来 我都这么干 但是没办法

allisone

allisone   4 小时 41 分钟前

用 django 一把梭

flniu

flniu   4 小时 8 分钟前

@ytmsdy 哥们你说的应该是卡丁车。F1 有离合器、档位,肯定不是一踩油门就走,也有倒档,没有 TCS/ABS 倒是真的。

flniu

flniu   3 小时 52 分钟前

我们的经验是:强制加类型提示,用 mypy 做类型检查(可以加到 pre-commit 或 /和 CI )。
另外也在用 black 做代码格式化,用 pylint 或 flake8 做风格检查。
这样综合起来,代码的可维护性会好很多。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK