Можно ли использовать инъекцию зависимостей в 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)
)
Должен признаться, что я не совсем понимаю, что такое «инъекция зависимостей», но, надеюсь, вы сможете использовать это, чтобы получить желаемую модель кода в питонической манере?