大型Django应用程序布局

Rob*_*ing 25 python django conventions

我是一个开发基于网络的大学门户网站的团队,该门户网站将基于Django.我们仍处于探索阶段,我正在努力寻找将项目/开发环境放在外面的最佳方法.

我最初的想法是将系统开发为Django"app",其中包含用于分离系统不同部分的子应用程序.我打算制作这些"子"应用程序的原因是它们在父应用程序之外没有任何用处,因此单独分发它们几乎没有意义.我们设想门户网站将安装在多个位置(例如,在不同的大学),因此可以将主应用程序放入许多Django项目中进行安装.因此,我们为每个位置的项目都有一个不同的存储库,它实际上只是一个settings.py定义已安装的门户应用程序的文件,以及一个urls.py路由到它的URL.

不过,我已经开始编写一些初始代码了,我遇到了一个问题.一些处理用户身份验证和配置文件的代码似乎没有家.它在概念上不属于门户应用程序,因为它与门户的功能无关.但是,它也不能进入项目存储库 - 因为我会在每个位置的存储库中复制代码.例如,如果我在此代码中发现了一个错误,我将不得不在所有位置的项目文件上手动复制修复程序.

我的修复想法是让所有项目repos成为"主"位置项目的分支,以便我可以从该主程序中提取任何更改.我认为这很麻烦,这意味着我还有一个存储库需要照顾.

我正在寻找一种更好的方法来实现这个项目.任何人都可以推荐一个解决方案或类似的例子,我可以看看?问题似乎是我正在开发一个Django 项目,而不仅仅是一个Django 应用程序.

Jac*_* M. 31

我发现的最好方法是创建应用程序,然后将项目粘合在一起.我的大多数项目都有类似的应用程序,每个都包含在内.电子邮件,备注,动作提醒,用户身份验证等.我首选的布局是这样的:

  • 项目/
    • settings.py
    • urls.py
    • views.py
    • ...
  • 应用/
    • 电子邮件/
      • urls.py
      • views.py
      • ...
    • 笔记/
      • urls.py
      • views.py
      • ...
    • ...

应用:

每个"应用程序"都独立存在,除了a之外settings.py,它不依赖于项目本身(尽管它可以依赖于其他应用程序).其中一个应用程序是用户身份验证和管理.它具有完成其任务的所有URL apps/auth/urls.py.它的所有模板都在apps/auth/templates/auth/.它的所有功能都是独立的,因此当我需要调整某些内容时,我知道该去哪里.

项目:

project/包含将这些单独的应用程序放在最终项目中所需的所有粘合剂.就我而言,我做了使用重型settings.INSTALLED_APPSproject/辨别从应用程序的观点是提供给我.这样,如果我拿走apps.notes了我的INSTALLED_APPS东西,一切都仍然有效,只是没有笔记.

保养:

这种布局/方法/计划也具有长期积极影响.您可以稍后重复使用任何应用程序,几乎不需要任何工作.您可以自下而上地测试系统,确保每个应用程序在整合到整体之前按预期工作,帮助您更快地找到/修复错误.您可以实现一个新功能,而无需将其推广到应用程序的现有实例(如果它不在INSTALLED_APPS,它们无法看到它).

我确信有更好的记录方式来布置项目,以及更广泛使用的方式,但这是迄今为止对我来说最有效的方法.

  • 赞同应用程序仍然可以依赖的警告.那说,他们应该有意义.如果你有评论,这依赖于django的auth应用程序.如果您有通知应用,则可能依赖于您的电子邮件应用.所有这些依赖关系都应该有详细记录. (3认同)

Ser*_*gey 5

您可以将常用功能提取到单独的模块中,并使您的应用程序依赖于它:

  • 我的门户
  • 授权模块
  • 配置文件模块
  • application1(取决于 auth_module)
  • application2(取决于auth_module和profiles_module)

我认为“经典”Django 项目似乎“包含”它正在使用的应用程序,这一事实阻止您看到图片 - 事实上,这是没有必要的。对于一个需要某种可插入模块的项目,我建议将应用程序组织为鸡蛋并使用 zc.buildout+djangorecipe 来管理所有内容。

这样您就可以将模块保持在扁平的单层结构中。Eggs具有指定依赖项的能力,因此如果您安装application1(见上文),auth_module将自动安装。

此外,将不同的配置部署到不同的服务器也很容易。假设您有安装了 application1 的 server1 和同时安装了 application1 和 application2 的 server2 - 您可以只有两个配置:

服务器1.cfg:

[buildout]
extends = base_deployment.cfg
eggs += application1
Run Code Online (Sandbox Code Playgroud)

服务器2.cfg:

[buildout]
extends = base_seployment.cfg
eggs += application1
        application2
Run Code Online (Sandbox Code Playgroud)

djangorecipe 还允许您为每个构建配置指定不同的设置文件,以便您能够将必要的位添加到主项目的 url 和已安装的应用程序设置中。

更不用说,您还可以有一个单独的配置用于开发配置(例如,安装 debug=True 并安装 Django 调试工具栏)。