Django: "项目"与"应用
我正在准备用Django构建一个相当复杂的“产品”。在这个情况下,我会避免使用“项目”和“应用程序”这两个词,因为我不太清楚它们在Django中的具体含义。
一个项目可以包含多个应用程序,而应用程序可以在多个项目之间共享。这很好。
我并不是在重新发明博客或论坛——我觉得我的产品没有任何部分可以在其他地方重复使用。直观上,我会称这个为一个“应用程序”。那么,我是否应该把所有的工作都放在一个“应用”文件夹里呢?
如果是这样的话……在Django的project.app
命名空间中,我倾向于使用myproduct.myproduct
,但当然这是不被允许的(不过我正在构建的应用就是我的项目,而我的项目也是一个应用!)。因此,我开始觉得,也许我应该按照每个“重要”模型来构建一个应用,但我不知道该如何在我的架构中划分边界,把它分成多个应用——我有很多模型,它们之间的关系相对复杂。
我希望能找到一个通用的解决方案……
6 个回答
试着回答这个问题:“我的应用程序到底在做什么?”如果你不能用一句话回答,那可能你可以把它拆分成几个逻辑更清晰的应用。
我在刚开始学习django不久后看到过这个想法,发现我经常问自己这个问题,这对我很有帮助。
你的应用不一定要能重复使用,它们可以相互依赖,但每个应用应该专注于做一件事情。
一旦你不再使用 startproject
和 startapp
这些命令,就没有什么能阻止你把一个“项目”和一个“应用”放在同一个Python包里。其实,项目不过是一个 settings
模块,而应用则是一个 models
模块——其他的东西都是可选的。
对于小型网站来说,像下面这样做是完全合理的:
site/
models.py
settings.py
tests.py
urls.py
views.py
为什么你不能使用 myproduct.myproduct
呢?要做到这一点,你大致需要做以下几件事:
django-admin.py startproject myproduct
cd myproduct
mkdir myproduct
touch myproduct/__init__.py
touch myproduct/models.py
touch myproduct/views.py
等等。如果我告诉你 views.py
不一定要叫 views.py
,这对你有帮助吗?只要你能在 Python 路径上命名一个函数(通常是 package.package.views.function_name),它就能被处理。就是这么简单。所有这些“项目”和“应用”的东西其实就是 Python 包。
那么,你应该怎么做呢?或者说,我可能会怎么做呢?如果你创建了一些重要的可重用功能,比如一个标记编辑器,那你就可以创建一个“顶级应用”,里面可能包含 widgets.py
、fields.py
、context_processors.py
等等——这些都是你可能想要导入的东西。
同样,如果你能创建一个像博客这样的东西,并且它在不同的安装中都能通用,你可以把它打包成一个应用,配上自己的模板、静态内容文件夹等等,然后配置一个 Django 项目实例来使用这个应用的内容。
没有硬性规定说你必须这样做,但这是框架的一个目标。所有内容,包括模板,都允许你从一些公共基础中包含,这意味着你的博客应该能很顺利地融入到其他设置中,只要它能照顾好自己的部分。
不过,针对你实际的担忧,是的,没有什么规定说你不能在顶级项目文件夹中工作。这就是应用的作用,如果你真的想这样做,你可以这么做。不过,我通常不这样做,原因有几个:
- Django 的默认设置并不这样做。
- 通常,我想创建一个主应用,所以我会创建一个,通常叫
website
。但在之后,我可能想为这个网站开发一些独特的功能。为了方便将来能移除(不管我是否真的会这样做),我通常会创建一个单独的目录。这样,我只需从配置中解除链接并删除文件夹,就能轻松删除这些功能,而不是复杂地从全局的 urls.py 文件中删除正确的 URL。 - 即使我想做一些独立的东西,它在我处理它/让它独立的时候也需要一个地方来存放。基本上就是上面的情况,但我打算让它变得通用。
- 我的顶级文件夹通常还包含其他一些东西,包括但不限于 wsgi 脚本、sql 脚本等。
- Django 的 管理扩展 依赖于子目录。因此,给包命名是有意义的。
总之,存在这种约定的原因和其他任何约定一样——它在别人与你的项目合作时会有所帮助。如果我看到 fields.py
,我立刻就会期待里面的代码是 Django 的字段的子类,而如果我看到 inputtypes.py
,我可能就不太清楚它的意思,得去看一下。