【问题标题】:how to handle common code in a django project which is used by multiple apps如何处理多个应用程序使用的django项目中的公共代码
【发布时间】:2015-09-13 13:43:25
【问题描述】:

深入研究 django 我遇到了处理代码的挑战,这些代码不是特定于 1 个应用程序而是由多个应用程序共享/使用的。

不(!)希望将其存储为应用程序的一部分(以避免应用程序依赖),而是将其存储在特定位置。

目前我的最佳做法是创建一个 django 应用“shared”,在其中放置此代码/功能

所以我的项目结构类似于:

mysite/
    manage.py
    mysite/
     ...
    shared
     ...
    app1
     ...
    app2
     ...
    app3
     ...
    ...

是否有“django best parctice”或更实用的方法来处理这个问题?

【问题讨论】:

  • 我通常会创建一个名为“core”的应用程序,并且不会将其称为最佳实践,但它已被知名人士推荐。 避免应用依赖是什么意思?
  • 谢谢。 app dependencies 我的意思是当我将代码放在 app1 中时,其他使用它的应用程序将依赖于 app1.
  • 应用依赖是否会产生问题?比依赖简单的 Python 模块更大的问题?
  • 我想隔离功能,以便应用程序变得自主,我可以在其他项目中重复使用它。仅仅因为依赖关系而不得不部署另一个应用程序(具有专用功能)对我来说并不好。当然 shared 也是一个应用程序...但它就像一个个人图书馆,只包含 not(!) 应用程序特定的代码。不知道这是否让它更清楚......

标签: python django


【解决方案1】:

我的回答灵感来自 edx-platform github 存储库中的文档:inter-app-apis

创建共享应用似乎是个好主意。但是,在项目开发的早期,很难确定是否真的需要在共享应用中包含某些内容。

如果您只共享一小部分功能,而不是尝试将共享代码完全拉入单独的应用程序中,那么如果您可以轻松管理依赖项会怎样?创建任何类型的依赖项的一个问题是它们有一种失控的方式,很快你就不会知道调用者依赖于应用程序的哪些部分。

为了解决这个问题,您可以定义一个单独的 Python 模块,充当提供共享代码的应用和调用共享代码的应用之间的代理。因此,如果您希望您的 app2app1 中使用某个函数 foo,则不要直接调用该函数,而是在 @ 内的单独模块(称为 api.py)中编写包装函数 foo_api 987654326@ 为您调用该函数。 app1 中被其他应用调用的所有函数都必须通过这个单一的 api 层。

通过这样做,您不会消除相互依赖的应用程序,而是更容易找到应用程序的依赖关系。如果你后来发现一个函数有很多调用者,那么你可以考虑将它们提取到一个单独的可重用库中。

【讨论】:

    【解决方案2】:

    我通常会做和你一样的事情。不确定这是否是最佳实践,但我见过其他人使用相同的方法。我喜欢它,因为:

    • shared/core/etc 应用在其他项目中变得有用时,您可以将其打包为可重复使用的应用,可以通过pip 安装到其他项目中
    • 它不会干扰项目中的现有应用

    关于将其打包为可重用库的唯一注意事项是,我建议将其重命名为 shared 以外的名称。原因是当你将它打包到 PyPI 中时,假设为my_django_utils,那么你将不得不更改所有项目中的所有导入。如果您现在想出一个通用名称,那么您将来可以轻松打包它,而无需更改所有导入...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-02
      相关资源
      最近更新 更多