Django:将项目拆分为应用的最佳实践

53

我真的很苦恼这个app-idea。我阅读了许多教程和样式指南,我知道应该尝试创建专门的应用程序,只做一件事。当看一些简单的教程项目时,这一切都是有意义的,但是当涉及到复杂的实际项目时,我发现自己无法确定应如何在不同的应用程序之间进行分割。

其中一个问题是,我想要有一个站点(或多个站点),用户可以看到很多不同的东西。遵循应用程序设计规则时,应该来自不同应用程序的内容。我该如何实现这样的功能?我的第一个想法是创建一个名为ui的应用程序,仅处理最终会导致模板的所有视图,而其他所有应用程序都提供模型和辅助函数。但是我担心ui应用程序会变得太大。

举个小例子:假设我想要一个网站,用户可以执行以下任务:

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

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

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

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

那么,有没有“正确”的方法来做到这一点?还是有任何模式可以使用吗?即使我已经阅读了很多文章,但我也希望能提供关于此主题的好资源链接。

2个回答

21

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

没有必要为每个与项目逻辑绑定的功能创建新应用程序。

可重用的应用程序是另一回事,它们的代码在某种程度上应该不知道实现细节。

可以参考Django的结构以获得灵感:Django的结构

你的示例可能的布局:

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文件,然后依次回溯到应用程序级别等(根据您的设置,从上到下)。当在跨项目重用代码部分时,这非常有用,您不想使用特定于项目的样式/模板钩子。请注意,深度模型需要在init文件中导入语句,并在模型的Meta类上使用app_label参数。 - Hedde van der Heide
谢谢!我已经重构了一些代码,现在对我来说更加清晰了。 - basilikum

16

我认为限定应用程序的最佳方法大致相当于在面向对象编程语言中限定类的方法。您可以将变量和方法替换为模型和视图:

模型是对象的状态,视图用于查看和交互该对象的状态。

我的经验法则是,如果创建应用程序有助于封装特定的一组模型,那么我就会尝试创建它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接