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

Django 中 APP 之间的界限是什么?

  •  
  •   fyyz · 2019-09-16 21:48:48 +08:00 · 4511 次点击
    这是一个创建于 1897 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近刚刚开始学 Django,不清楚为什么要在一个 Project 里划分 APP。

    因为我看 Django 的一个 Project 是一个 Website,而一个 Website 通常来说,是每个功能都要用到同一个数据库的,如果划分成 APP,岂不是要跨 APP 读取 Models 文件了?

    15 条回复    2019-09-26 09:04:45 +08:00
    saulshao
        1
    saulshao  
       2019-09-16 22:10:35 +08:00
    app 实际上是一个包。
    这个我觉得和 Java 的包概念有点像。
    这么划分更多的是为了方便管理代码。一个大型的系统,功能是非常繁多而且复杂的。
    fyyz
        2
    fyyz  
    OP
       2019-09-16 22:26:45 +08:00
    @saulshao 我现在做个论坛,注册 /登录功能需要做成 APP 吗
    n37r06u3
        3
    n37r06u3  
       2019-09-16 22:29:48 +08:00
    django app 主要是划分功能用的,整的结构比较好,可以复用
    arischow
        4
    arischow  
       2019-09-16 22:30:01 +08:00 via iPhone
    @fyyz 不要多想,起码暂时都放一个 app (以我做个人和公司项目的经验)
    arischow
        5
    arischow  
       2019-09-16 22:31:39 +08:00 via iPhone
    注册登录只是用户里面的功能,如果一定要划分 app,这个 app 应该是 user
    michaelevil
        6
    michaelevil  
       2019-09-16 22:37:50 +08:00
    可以给项目做一个顶层分解,分成几个大模块。然后根据这个分 app。
    这样也比较好配置 urls.py ,毕竟路径一般都会遵循项目的结构形成树状。
    fyyz
        7
    fyyz  
    OP
       2019-09-16 22:56:15 +08:00
    @arischow 我其实也是这么想的,如果存在跨 models 的情况,拆分太细,稍有不慎就可能会出现 models 循环依赖的问题。
    yuhr123
        8
    yuhr123  
       2019-09-16 23:06:34 +08:00
    app 便于功能复用,实现功能之间的高内聚和低耦合。比如你提到的,用户中心(登录、注册等)这个就可以通过创建 users 应用来实现。
    izoabr
        9
    izoabr  
       2019-09-16 23:14:06 +08:00
    或者说 APP 更像是规划用来解决某一项或某一类业务或功能范围的子应用代码的集合包,目的更大的就是楼上前辈们说的那样方便管理,用业务范围来区分。
    比如说,我会把订单管理和生产管理分开两个 APP,虽然他们之间会有一些关联,但那样分开的好处就是只要某个功能需要修改,我就知道应该去哪个目录找代码,不然时间长了有时候真记不住。
    fen
        10
    fen  
       2019-09-16 23:22:44 +08:00 via Android
    一般来说界限就是业务界限,
    多个业务团队开发互不干扰,
    业务新增终止不影响其他 app
    freakxx
        11
    freakxx  
       2019-09-16 23:24:54 +08:00
    对于 django 来说,有一个很重要的东西叫,reusable。

    app 的划分标准来说,也可以说是按照这个标准去做。

    ----

    所以你可以有一个叫 auth 的 app 来包含 user,perms 和 groups。

    也可以单独各自写 user,perms 和 groups。

    ----

    > 因为我看 Django 的一个 Project 是一个 Website,而一个 Website 通常来说,是每个功能都要用到同一个数据库的,如果划分成 APP,岂不是要跨 APP 读取 Models 文件了?

    这种情况,其实一个业务 app 就够了,如果你的业务不复杂的话。

    如果再复杂一些,你可以建个 file app 专门做文件管理;
    再做文章和活动的 app 单独管理不同的业务;

    最后通过 user 来勾连起来不同的 model,如果有需要的话。

    然后通过 config 的 urls 来勾连不同 app 的 url。
    a719114136
        12
    a719114136  
       2019-09-16 23:37:12 +08:00 via Android
    一般就是按功能分,本 app 使用本 app 的 model,其他 app 需要使用本 app 的 model 的话写个函数供调用。

    至于重复引用,可以靠拆包,提取共用函数解决,不过这会让原来分好的结构又打乱。一般出现重复引用的话在用到的地方 import 就行。
    hellotime
        13
    hellotime  
       2019-09-17 10:38:37 +08:00
    独立的包,结构清晰。
    saulshao
        14
    saulshao  
       2019-09-17 22:50:00 +08:00
    其实谈不上什么界限,完全就是你自己怎么分,不过用户认证和权限这种东西建议独立应用
    Harlaus
        15
    Harlaus  
       2019-09-26 09:04:45 +08:00
    社区,用户中心(登录、注册等),一个 app
    订单管理,一个 app
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1030 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 22:10 · PVG 06:10 · LAX 14:10 · JFK 17:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.