Flask VS Laravel 对比、吐槽带疑问

2018-06-05 17:05:26 +08:00
 waacoo

出于对 Python 的热爱,想把用 laravel 建的站用 flask 来一遍。突然发现 flask 灵活的我掌控不了方向盘了。虚心、小心吐槽:

1、路由。

laravel 有专门的 routes,一目了然的进行权限控制;flask 该如何分离(把她从装饰器中抽出来,不然几十条主路由加上 GET/POST 会头疼)、组织路由?权限控制中,有否判断用户登录后,就直接用 User 类来操作模板的相关内容的,而不是 session 中的 user_id (目前正在学某课堂的 flask )。

2、MVC。

laravel 的 model 和 controller 分离的很干净,各司其职;感觉 flask 的 MC 放在一起了,如何组织 models 和 controller 如何让他们各司其职呢?

3、蓝图

flask 的蓝图的分割思路不错,个人感觉 flask 是从模块在分割程序,而 laravel 是从 MVC 的功能在分割程序,各有千秋。有没有好的蓝图思路?

4、数据库

非常喜欢 flask 的 migrate 插入方式,比 laravel 用的简单,不知道 flask 有没有 db:seed 这种假数据来玩玩?

5、errors

flask 的错误需要自己写字典来判断,laravel 有专门的错误提醒判断,flask 表单的错误提醒有啥好的包用吗?

学 flask 让我更加理清了程序在干什么,如潜水;学 Laravel 让我知道在操作什么,如游泳。

本人业余爱好编程,干着跟编程不着边的工作,laravel 和 flask,php 和 Python 都是看文档才会写的半瓢水,请大神轻喷,虚心求教。

下面是我用 laravel 做的一个站,练手的,没人看,准备下个月停掉,四字母 com 域名,有兴趣的可以看看: ZHV6ay5jb20=

4629 次点击
所在节点    问与答
6 条回复
Vogan
2018-06-05 17:16:37 +08:00
Flask 和 Laravel 是两个量级的产品。
比较也应该用 Django 和 Laravel 比。
Flask 的就在于轻,长时间积累趁手的库开发舒服。
Laravel 在于丰富,想要什么手边的虽然可能不是最好的,但都能拿过来直接用。
waacoo
2018-06-05 17:34:40 +08:00
@Vogan 多谢指点
Kilerd
2018-06-05 17:56:32 +08:00
严格来说 Laravel 对标的是 Django。不过既然你发问了,就回答一下吧

1 路由问题

Flask 中通常使用装饰器来做权限管理

```python
@route('/admin')
@role(Role.Admin)
def admin_panel():
pass
```

这就需要自己实现 role 这个方法,当然了已经有不少 Extension 做这方面的工作了。 而且你也可以用 Signal 来做这件事情

2 MVC

关于这点,看得出你对后端的架构层次不是很熟练,我通常是这样分层的。
Model 层,用 ORM 定义数据库模型。
Service 层,调用 Model 完成业务基本逻辑
Controller 层,在 Flask 里面就是每一个 route, 调用 Service 层,不会直接调用 Model 层。

当然啦,当架构再大点的时候,Model 和 Service 层中间可以加入一个 Cache 层。
Model 层之前还可以加一个数据驱动层做接口统一,因为你的数据可能不只是来源于一个数据库 ( PG,REDIS etc )
所以,复杂之后就是这样了 Driver -> Model -> Cache -> Service -> Controller

基本上很多 Flask 的教程都会教你如何在用 ORM 定义 Model 的时候直接在 Model class 里面定义业务逻辑,比如 User Model 里面定义 login register 逻辑。 这样的做法实际上是整合了 Service 层进 Model 层。
这样的处理手法不是说不行,而是项目复杂之后,逻辑不够清晰,同时 Model 复杂之后,会出现循环引用的问题。

3 BluePrint

是的,蓝图的意图就是在于把一个项目分成不同的模块,在解藕之后,可以大幅度的提升 BluePrint 的重用性。 比如一个第三方登录的模块就可以在多个项目中直接使用(这也可以抽象成一个 Extension )。

怎么分割 BluePrint 比较常用的依据就是 「根据 url prefix 来区分」

4 数据库

flask 的 migration 说实话并不好用,个人比较习惯用 alembic。fake data 这个没有了解,都是在写单元测试的时候根据业务自己想的

5 errors

这点不清楚你在描述哪方面的东西。flask-wtf 在表单上面的处理已经很棒了。
waacoo
2018-06-05 18:09:46 +08:00
@Kilerd 很实用的建议,感谢!你的第二点我要再学学才能消化,三克油
iyaozhen
2018-06-05 18:12:08 +08:00
这就是企业级框架和轻量框架的区别。
企业级框架的核心就是制约
johnsona
2020-06-15 16:24:10 +08:00
@Kilerd 写的很好,django 也是在 model 中定义 service 层的方法,当然 django 还有一个 manager 一般来说,涉及到多个 model 就直接跑到 controller 了,太负责还是上 controller,我也觉得 laravel 不错

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/460625

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX