Как внедрить атрибут или объект в представление в Django Rest Framework? - PullRequest
0 голосов
/ 10 ноября 2018

Я новичок в 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 """

И у меня в пакете класс утилит, например:

класс MyUtilClass: "" "Помогает с вещами" ""

def some_method (self, path): print («Я сейчас сделаю все по пути:», путь)

Теперь я хотел бы добавить экземпляр какого-то другого класса, который выполняет какую-то задачу, которую он должен сделать, на мой взгляд. Примерно так:

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 """

Каков наилучший способ внедрить такой экземпляр в мой класс представлений?

Я не мог найти много об этом в документации. Я знаком с использованием контейнеров DI и IoC. Однако я не уверен, как Django Rest Framework справится со всем этим.

1 Ответ

0 голосов
/ 10 ноября 2018
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)

Тогда вы можете просто вызвать MyUtilClass.some_method(path) в представлении, не создавая экземпляр MyUtilityClass

...