【问题标题】:Django: best practice for splitting up project into apps [closed]Django:将项目拆分为应用程序的最佳实践[关闭]
【发布时间】:2017-11-23 01:48:12
【问题描述】:

我真的在为整个应用理念而苦苦挣扎。我阅读了很多教程和风格指南,我知道我应该尝试创建专门的应用程序,只做一件事。在查看一些简单的教程项目时,这一切都是有道理的,但是一旦涉及到一个复杂的现实生活项目,我发现自己无法确定应该如何在不同的应用程序之间划清界限。

其中一个问题是,我希望有一个站点(或多个站点),用户可以在其中看到很多不同的内容。遵循应用程序设计规则时,应该来自不同应用程序的东西。我怎么会意识到这样的事情?我的第一个想法是创建一个名为ui 的应用程序,它只处理实际导致模板的所有视图,所有其他应用程序都提供模型和辅助函数。但我担心ui 应用程序会变得很大。

给你一个小例子:让我想要一个用户可以执行以下任务的网站:

  • 选择一个主题
  • 为所选主题设置一些选项
  • 上传与他的帐户关联的文件
  • 将一些上传的文件分配给主题
  • 录制一些与主题相关的音频

现在,我将创建三个应用程序:

  1. 主题(包含主题模型和一些相关模型)
  2. resources(包含资源模型,处理上传)
  3. 音频(处理所有音频录制和处理内容)

但是,我需要某种mainui 应用程序来处理这些应用程序如何交互并创建实际站点,所有应用程序都以某种方式参与其中。

那么,有什么“正确”的方法可以做到这一点吗?或者有什么我可以使用的模式吗?即使我已经阅读了很多,我也希望能提供有关该主题的优质资源的链接。

【问题讨论】:

    标签: django django-apps


    【解决方案1】:

    你只需要确保你的结构对有意义。

    不需要为绑定到项目逻辑的另一部分的每个功能都创建一个新应用。

    可重用的应用程序完全不同,它们的代码在某种程度上应该不知道实现。

    看看Django's structure 寻找灵感

    您的示例的可能布局:

    project_root/
        project/
            __init__.py
            settings.py
            urls.py
            templates/
                app1/  # override stuff
            static/
            media/
        app1/
            __init__.py
            admin/  # as a package
                __init__.py
                subjects.py
                resources.py
                # etc
            models/  # as a package
                subjects.py
                resources.py
                # etc
            managers/
                __init__.py
                subjects.py
                resources.py
                # etc
            services/
                __init__.py
                audio.py  # upload handler etc
            views/
                __init__.py
                subjects.py
            urls/
                __init__.py
                subjects.py
            templates/
                app1/
                    subject_list.html  # override at project level
            static/
                app1/
                    css/
                        subject.css  # override at project level
        app2/
            __init__.py
            models.py  # holds a Member model or whatever you require
        manage.py
    

    【讨论】:

    • 非常感谢!也许我有点过度思考整个应用程序模式。但这实际上更有意义。但是有一个问题:“在项目级别覆盖”如何工作?或者你的意思是什么?
    • @basilikum Django 的继承系统会首先在你的项目级别中查找模板或 css 文件,然后求助于应用程序级别等(取决于您的settings,从上到下)这很有用在跨项目重用部分代码时,您不想使用项目特定的样式/模板挂钩。请注意,打包深度模型需要 init 文件中的 import 语句,并在模型的 Meta 类上使用 app_label 参数。
    • 再次感谢!我已经对我的一些代码进行了重组,它对我来说已经干净了很多。
    【解决方案2】:

    我认为划分应用程序的最佳方式大致相当于在面向对象的编程语言上划分类的方式。您可以分别考虑模型和视图,而不是变量和方法:

    模型是对象的状态,视图用于查看对象的状态并与之交互。

    我的经验法则是,创建应用程序是否有助于encapsulate 一组特定的模型?如果是这样,那么我尝试创建它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-15
      • 1970-01-01
      • 2015-07-02
      • 1970-01-01
      • 1970-01-01
      • 2011-02-12
      • 2016-02-20
      相关资源
      最近更新 更多