Python 大型Django应用程序布局
我在一个开发基于网络的大学门户的团队中,该门户将基于Django。我们仍处于探索阶段,我正试图找到规划项目/开发环境的最佳方法 我最初的想法是将系统开发为一个Django“app”,其中包含用于分离系统不同部分的子应用程序。我之所以打算创建这些“子”应用程序,是因为它们在父应用程序之外没有任何用途,所以将它们单独分发没有什么意义。我们设想门户将安装在多个位置(例如,在不同的大学),因此可以将主应用程序放入多个Django项目中进行安装。因此,每个位置的项目都有一个不同的存储库,它实际上只是一个定义已安装门户应用程序的Python 大型Django应用程序布局,python,django,conventions,Python,Django,Conventions,我在一个开发基于网络的大学门户的团队中,该门户将基于Django。我们仍处于探索阶段,我正试图找到规划项目/开发环境的最佳方法 我最初的想法是将系统开发为一个Django“app”,其中包含用于分离系统不同部分的子应用程序。我之所以打算创建这些“子”应用程序,是因为它们在父应用程序之外没有任何用途,所以将它们单独分发没有什么意义。我们设想门户将安装在多个位置(例如,在不同的大学),因此可以将主应用程序放入多个Django项目中进行安装。因此,每个位置的项目都有一个不同的存储库,它实际上只是一个定
settings.py
文件,以及一个url.py
将URL路由到它
不过,我已经开始编写一些初始代码,我遇到了一个问题。处理用户身份验证和配置文件的一些代码似乎没有主页。它在概念上不属于门户应用程序,因为它与门户的功能无关。但是,它也不能进入项目存储库,因为我会在每个位置的存储库上复制代码。例如,如果我在这段代码中发现了一个bug,我将不得不手动在该位置的所有项目文件上复制修复
我对修复的想法是将所有的项目回购作为“主”位置项目的一个分支,这样我就可以从该主位置获取任何更改。我认为这很混乱,这意味着我还有一个存储库要处理
我正在寻找一个更好的方式来实现这个项目。有谁能推荐一个解决方案或类似的例子让我看看吗?问题似乎是我正在开发一个Django项目,而不仅仅是一个Django应用程序。您应该看看:
- 德扬戈
- Django最佳实践,如果您想重复使用
- GIT或任何其他CVS(GIT非常适合维护+部署)
- 如果您需要自动化部署/更新
- /Django项目
- /应用程序
- /main#主代码
- /静态#每个子应用程序都可以提供静态服务
- /附件1
- /静态#每个子应用程序都可以提供静态服务
- /附件2
- /脚本#manage.py、wsgi、apache.conf、fabfile.py
- /核心#你的图书馆
- 设置.py
- 本地_settings.py
- /应用程序
使用django创建真正可重用的应用程序并不容易。我发现最好的方法是创建应用程序,然后创建一个项目将它们粘合在一起。我的大多数项目都有类似的应用程序,它们都包含在每个项目中。电子邮件、笔记、动作提醒、用户身份验证等。我的首选布局如下:
- 计划/
- 设置.py
- url.py
- views.py
- 应用程序/
- 电子邮件/
- url.py
- views.py
- 注释/
- url.py
- views.py
- 电子邮件/
settings.py
,它们不依赖于项目本身(尽管它可以依赖于其他应用程序)。其中一个应用程序是用户身份验证和管理。它在apps/auth/URLs.py
中有用于完成任务的所有URL。其所有模板都位于apps/auth/templates/auth/
中。它的所有功能都是自包含的,所以当我需要调整某些东西时,我知道该去哪里
项目:
项目/
包含将这些单独的应用程序组合到最终项目中所需的所有粘合剂。在我的例子中,我大量使用了设置。在project/
中安装了应用程序
,以识别哪些应用程序视图对我可用。这样,如果我从我安装的应用程序中取出应用程序.notes
,一切仍然运行得很好,只是没有任何注释
维护:
这种布局/方法/计划也有长期的积极影响。您可以在以后重复使用任何应用程序,几乎不需要任何工作。您可以自下而上测试系统,确保每个应用程序在集成到整个系统之前都能按预期工作,帮助您更快地发现/修复错误。您可以实现一个新功能,而无需将其推出到应用程序的现有实例中(如果它不在已安装的应用程序中,它们将看不到它)
我确信有更好的文档化方法来规划项目,也有更广泛使用的方法,但这是迄今为止对我最有效的方法。您可以将常用功能提取到单独的模块中,并使您的应用程序依赖它:
- 我的门户
- 认证模块
- profiles\u模块
- 应用程序1(取决于身份验证模块)
- 应用程序2(取决于身份验证模块和配置文件模块)
我认为,一个“经典”Django项目似乎“包含”了它正在使用的应用程序,这一事实阻止了你看到图片——事实上,这是没有必要的。对于一个项目,您将拥有某种可插入模块,我建议将应用程序组织为鸡蛋,并使用zc.buildout+djangomipe来管理一切
这样,您就可以将模块保持在一个扁平的一级结构中。鸡蛋能够指定依赖项,所以
[buildout]
extends = base_deployment.cfg
eggs += application1
[buildout]
extends = base_seployment.cfg
eggs += application1
application2