【问题标题】:What is the right way to use service methods in Django?在 Django 中使用服务方法的正确方法是什么?
【发布时间】:2020-11-05 15:15:30
【问题描述】:

例如,假设我正在使用 Django Rest Framework 构建一个 Rest API。现在作为应用程序的一部分,一些方法在所有视图中都是通用的。我的做法是在根目录下,我创建了一个 services.py 文件。在该模块内部,是一个包含所有常用实用程序方法的类 (CommonUtils)。在同一个 services.py 模块中,我实例化了一个 CommonUtils 对象。

现在在整个应用程序中,在不同的views.py 文件中,我从模块中导入对象并调用该对象的方法。所以,本质上我是使用单例对象来实现常用的实用方法。

我觉得这不是一个好的设计方法。因此,我想解释一下为什么这种方法不是一个好主意,以及实现相同目标的最佳实践或最佳方法是什么,即在所有 views.py 文件中使用一组通用实用程序方法。

提前致谢。

【问题讨论】:

  • 这是一个非常主观的问题。我从事的每个项目最终都有一个utils 模块/包,因为所有事物都有共同的逻辑。但是,这些函数通常很小,并且其中没有业务逻辑。
  • 您从使用该课程中获得了什么好处?
  • 该类应该包含在整个 django 应用程序中使用的常用功能。例如。可能从某个地方提取样本数据,或者可能是一些用于解析数据的逻辑等。

标签: python django design-patterns


【解决方案1】:

这是正确的设计吗?为什么?如何做得更好?

我觉得这不是一个好的设计方法。因此,我想解释一下为什么这种方法不是一个好主意,以及实现相同目标的最佳实践或最佳方法是什么,即在所有 views.py 文件中使用一组通用实用程序方法。

就像@Dmitry Belaventsev 上面写的那样,没有解决这个问题的一般规则。这是cross-cutting-concerns的典型案例。

现在在整个应用程序中,在不同的views.py 文件中,我从模块中导入对象并调用该对象的方法。所以,本质上我是使用单例对象来实现常用的实用方法。

是的,您的实现实际上是一个单例,它没有任何问题。你应该问自己你想要实现什么你真正需要什么。解决方案有很多,你可以从最基本的开始:

python模块中的一个简单函数

# file is named utils.py and lives in the root directory

def helper_function_one(param):
   return transcendent_all_evil_of(param)

def helper_function_two(prename, lastname):
   return 'Hello {} {}'.format(prename, lastname)

在 Python 中,在模块中仅使用普通函数并不少见。如果确实有必要并且您需要类和对象的优势,您可以将其升级为方法(和类)。

您也可以使用带有静态方法的

# utils.py

class Utils():
   @staticmethod
   def helper_one():
       print('do something')

但是你可以看到,除了类的额外层之外,这与使用普通函数的解决方案没有什么不同。但它没有进一步的价值。

你也可以写一个单例类,但在我看来,这不是很pythonic,因为你在模块中使用一个简单的对象实例会得到相同的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 2020-01-21
    • 2021-05-24
    相关资源
    最近更新 更多