python - 如何将属性或对象注入(inject)到 Django Rest Framework 中的 View 中?

标签 python django dependency-injection django-rest-framework inversion-of-control

我对 Django Rest Framework 有点陌生。

我有一个 views.py ,看起来像这样:

class MyAPIView(APIView):
  """ My API """

  def get(self, request, path):
    """ Handles GET calls """

  def post(self, request, path):
    """ Handles POST calls """

我的包中有一个 util 类,如下所示:

类MyUtilClass: """帮忙解决问题"""

def some_method(自身, 路径): print('我现在将对路径执行操作:', path)

现在,我想注入(inject)一些其他类的实例,该类执行我认为应该执行的某些任务。像这样的事情:

class MyAPIView(APIView):
  """ My API """

  _some_util_instance = None # How to inject this?

  def __init__(self, util_instance):
    self._some_util_instance = util_instance # Is this the right way?

  def get(self, request, path):
    """ Handles GET calls """
    self._some_util_instance.some_method(path) # This is why I want this object injected.

  def post(self, request, path):
    """ Handles POST calls """

将此类实例注入(inject)我的 View 类的最佳方法是什么?

我在文档中找不到太多相关内容。我熟悉使用 DI 和 IoC 容器。但是,我不确定 Django Rest Framework 如何处理所有这些。

最佳答案

class MyAPIView(APIView):
    """ My API """

    _some_util_instance = MyUtilClass()

或者

class MyAPIView(APIView):
    """ My API """

    def __init__(self, *args, **kwargs):
        self._some_util_instance = MyUtilClass()
        super().__init__(self, *args, **kwargs)

或者

MyAPIView.as_view(
    _some_util_instance=MyUtilClass()
)

class MyAPIView(APIView):
    """ My API """

    _some_util_instance = None

或者

不要使用类作为实用函数的容器,只需将它们定义为模块级函数。这是我首选的方法。

或者

使用静态/类方法

class MyUtilClass:
    """ Helps out with stuff """

    @classmethod
    def some_method(cls, path):
         print('I will now do things to the path: ', path)

然后你可以简单地在 View 中调用MyUtilClass.some_method(path),而不需要创建MyUtilityClass的实例

关于python - 如何将属性或对象注入(inject)到 Django Rest Framework 中的 View 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53234190/

相关文章:

python - Django 忽略测试数据库设置

django - 如何使用相应的 Django 模型为 Postgres DB 中的列添加 "description"?

c# - Ninject - 静态类中的内核?

python - tkinter - 无限 Canvas "world"/"view"- 跟踪 View 中的项目

python - 是否有无限迭代器的表达式?

python - Django 1.8 错误 : No database fixture specified

python - 请参阅 loaddata 命令的回溯(错误时)

c# - 在大型依赖对象图上注入(inject)模拟

dependency-injection - 类库中带有 Ninject 的 DI

python - 使用 Python 使用来自 Azure 事件中心的消息?