Django:将项目分成应用程序的最佳实践

时间:2013-08-16 10:11:45

标签: django django-apps

我真的在努力应对整个应用程序的想法。我阅读了很多教程和样式指南,我知道我应该尝试创建专门的应用程序,这只做一件事。在查看一些简单的教程项目时,这一切都很有意义,但一旦进入复杂的现实生活项目,我发现自己无法确定应该如何划分不同应用程序之间的界限。

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

举个小例子:让我想拥有一个用户可以执行以下任务的网站:

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

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

  1. 科目(包含主题模型和一些相关模型)
  2. 资源(包含资源模型,处理上传)
  3. audio(处理所有录音和处理内容)
  4. 但是,我需要某种mainui应用来处理这些应用如何互动以及创建实际网站,其中所有应用都以某种方式参与其中。

    那么,有没有“正确”的方法来做到这一点?或者我可以使用任何模式吗?我也很欣赏有关这个主题的良好资源的链接,尽管我已经阅读了不少内容。

2 个答案:

答案 0 :(得分:11)

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

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

可重用的应用程序是一个完全不同的故事,它们的代码应该在某种程度上不了解实现。

查看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

答案 1 :(得分:7)

我认为划分应用程序的最佳方法大致相当于在Objected Oriented Programming Language上划分类的方式。您可以分别考虑模型和视图,而不是变量和方法:

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

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