V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
waacoo
V2EX  ›  问与答

Flask VS Laravel 对比、吐槽带疑问

  •  
  •   waacoo · 2018-06-05 17:05:26 +08:00 · 4442 次点击
    这是一个创建于 2152 天前的主题,其中的信息可能已经有所发展或是发生改变。

    出于对 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=

    6 条回复    2020-06-15 16:24:10 +08:00
    Vogan
        1
    Vogan  
       2018-06-05 17:16:37 +08:00
    Flask 和 Laravel 是两个量级的产品。
    比较也应该用 Django 和 Laravel 比。
    Flask 的就在于轻,长时间积累趁手的库开发舒服。
    Laravel 在于丰富,想要什么手边的虽然可能不是最好的,但都能拿过来直接用。
    waacoo
        2
    waacoo  
    OP
       2018-06-05 17:34:40 +08:00 via iPhone
    @Vogan 多谢指点
    Kilerd
        3
    Kilerd  
       2018-06-05 17:56:32 +08:00   ❤️ 2
    严格来说 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
        4
    waacoo  
    OP
       2018-06-05 18:09:46 +08:00 via iPhone
    @Kilerd 很实用的建议,感谢!你的第二点我要再学学才能消化,三克油
    iyaozhen
        5
    iyaozhen  
       2018-06-05 18:12:08 +08:00 via Android
    这就是企业级框架和轻量框架的区别。
    企业级框架的核心就是制约
    johnsona
        6
    johnsona  
       2020-06-15 16:24:10 +08:00
    @Kilerd 写的很好,django 也是在 model 中定义 service 层的方法,当然 django 还有一个 manager 一般来说,涉及到多个 model 就直接跑到 controller 了,太负责还是上 controller,我也觉得 laravel 不错
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1699 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 17:00 · PVG 01:00 · LAX 10:00 · JFK 13:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.