Можно ли использовать инъекцию зависимостей в django?

Я очень люблю использовать технику инъекции зависимостей для разделения кода. Обычно это включает в себя предоставление функциональности объекту в конструкторе его зависимого объекта.

Впервые я использую django для создания веб-апи (с базой данных объектов). Я намеревался внедрить сложную зависимость в простой метод. (в моем случае это была функциональность для интерпретации сообщений, приходящих от обмена RabbitMQ, но мой минимальный пример - это просто интерпретация общего сообщения как словаря, зависящего от сайта).

Однако в django все кажется автогенерируемым либо из статических методов, либо из определения классов, я не смог найти, где что-либо действительно инстанцируется или настраивается, чтобы вставить зависимость.

Просто техника и фреймворк django несовместимы или я что-то упускаю?

Код на данный момент

(минимальный пример отдыха, не реальный код)

в urs.py:

urlpatterns = [
    path("run/", views.run),
]

в файле views.py

def run(request):
    interpreter = AbstractDataInterpreter() #This is the object I want to inject
    data = interpreter.interpret(request)
    return JsonResponse(data, safe=False)

У меня есть тестовый класс TestDataInterpreter, который я использую для тестирования.

У меня есть класс CustomDataInterpreter для моего домена/экосистемы.

В дальнейшем я планирую использовать другие переводчики для различных развертываний.

Но я не могу найти механизм, чтобы действительно внедрить интерпретатор в команду run на разных установках.

В Python вы можете написать «класс», который предназначен для наследования другими классами, но сам по себе бесполезен. В документации по представлению Django на основе классов вы найдете такие классы, описанные как «Mixin». Главное правило (чтобы избежать безумия, вызванного множественным наследованием) заключается в том, что классы Mixin должны наследоваться от object и всегда наследуются слева от класса, в который они смешиваются. См. ниже.

Кроме того, в Python тривиально легко динамически сконструировать класс, используя трехаргументную форму функции type. Таким образом, статическое объявление типа

class MyView( LoginRequiredMixin, ListView):
    pass

может быть динамически создан как

MyView = type( 'MyView',             # __name__ of the class,
    (LoginRequiredMixin, ListView),  # classes it inherits from, ordered
    {}                               # __dict__ (added class vars and methods)
)

Должен признаться, что я не совсем понимаю, что такое «инъекция зависимостей», но, надеюсь, вы сможете использовать это, чтобы получить желаемую модель кода в питонической манере?

Вернуться на верх