首页 > 解决方案 > 我应该在 django 项目中使用内部 API 在应用程序之间进行通信吗?

问题描述

我正在构建/管理一个 django 项目,其中包含多个应用程序。一个存储调查数据,另一个存储分类器,用于向调查数据添加特征。例如,这个调查的答案是否令人悲伤?0/1。此功能将与调查数据一起存储。

我们正在尝试决定在应用程序中如何以及在何处实际执行此特征化,并且我被推荐了一些对我没有任何意义的方法,但我对 django 也不是很熟悉,或者超过爱好规模的网络开发,所以我想得到另一个意见。

数据应用程序显然需要访问分类器应用程序,以便能够在数据上运行分类器,然后重新插入特征化数据,但如何访问分类器已成为争议。对我来说,显而易见的方法是直接导入它们,a la

# from inside the Survey App
from ClassifierModels import Classifier
cls = Classifier.where(name='Sad').first() # or whatever, I'm used to flask
data = Survey.where(question='How do you feel?').first()
labels = cls(data.responses)
# etc.

但是,我的一位工程师说这是不好的做法,因为应用程序不应该导入彼此的模型。相反,这两者应该只通过内部 API 进行通信,即将所有数据发布到

http://our_website.com/classifiers/sad

并以这种方式取回它。

所以,我觉得最紧迫的问题是什么:看在上帝的份上,为什么会有人这样做?在我看来,它更像是严格意义上的更多代码(构建和处理请求),严格意义上不那么直观的代码,构建更多,更难使用,并且令人费解的间接,就像给你自己的房子寄一封信而不是与住的人交谈在那里,和你在一起。

但也许更容易回答大块,

1)第一个直接的导入其他应用程序模型方法真的有什么问题吗?(我找到的唯一答案是“不!”,但同样,这是由我的开发人员推动的,他确实有更多的工业经验,所以我想确定一下。)

2) 通过内部 API 执行此操作的实际好处是什么?(我当然问过,但只得到了感觉上的理论答案,没有解决具体问题,越来越复杂的代码没有明显的好处。)

3) 我们的应用程序和团队的规模在多大程度上影响了最佳决策?我们有大约 1.75 名开发人员,即使我们非常雄心勃勃,也只有四个用户。(这个应用程序正在内部使用,以支持咨询业务。)所以对我来说,任何关于最佳实践等的问题都必须考虑到我们双方都有小团队,需要一些稳定、实用和精简的东西,而不是处理大负载的东西,或者是外部安全的,或者快速的,或者容易被大团队处理的东西,等等。

4)如果这些都不对,最好的方法是什么?

标签: django

解决方案


应用程序不应该导入其他应用程序的模型是不正确的。对于一个简单的反驳,想想 django.contrib 中的应用程序,其中包含诸如 User 和 ContentType 之类的模型,这些模型旨在被其他应用程序导入和使用。

这并不是说内部 API 没有好的用例。我正在计划自己建造一个。但只有当您打算有一天将应用程序拆分为单独的服务时,它们才真正适合。如果您不在基于服务的架构中,则单独使用内部 API 没有多大意义。


推荐阅读