Python django视图中的依赖项注入
我想在django项目中使用依赖注入。为此,我正在试着包装。就像在ASP.NET中一样,所有依赖项都在构造函数中给出,这非常好,因为它很容易测试。我还想在django项目中归档类似的内容 我有一个简单的看法:Python django视图中的依赖项注入,python,django,dependency-injection,Python,Django,Dependency Injection,我想在django项目中使用依赖注入。为此,我正在试着包装。就像在ASP.NET中一样,所有依赖项都在构造函数中给出,这非常好,因为它很容易测试。我还想在django项目中归档类似的内容 我有一个简单的看法: 类MySimpleView(视图): 定义初始值(自我、依赖1、依赖2、**kwargs): 超级() ... 我定义绑定的地方 #di.py 类AppBindingSpec(pinject.BindingSpec): def配置(自我、绑定): #在这里进行绑定 obj_graph=p
类MySimpleView(视图):
定义初始值(自我、依赖1、依赖2、**kwargs):
超级()
...
我定义绑定的地方
#di.py
类AppBindingSpec(pinject.BindingSpec):
def配置(自我、绑定):
#在这里进行绑定
obj_graph=pinject.new_object_graph(绑定规范=[AppBindingSpec()]))
我希望能像这样使用它
#url.py
URL模式=[
path('path/to/my/view',obj_graph.provide(MySimpleView.as_view()),
]
但不幸的是,django不允许从实例调用.as\u view()
有没有简单的方法可以将依赖项注入到我的视图中,这样我就可以轻松地进行模拟和测试?如果您的目标是为自己提供一种简单而安全的“模拟和测试”方法,那么您最好使用
unittest提供的方法(顺便说一句,这也很像.NET中的模拟)。有了它,您可以执行以下操作:
从unittest.mock导入mock,补丁
从django.tests导入TestCase
类MySimpleViewTestCase(TestCase):
@修补程序('module_name.dependency2')
@补丁('module\u name.dependency1.specific\u method\u或\u attribute')
def test_something_关于我的简单视图(self、mock_dependency1、mock_dependency2):
mock_dependency 1.return_value=mock(some_attribute=“foo”,some_method.return_value=“bar”)
模拟依赖项2.return\u值=42
#对MySimpleView进行测试
现在,当测试运行时,mock
将用mock对象替换任何module\u name.dependency1.specific\u method\u或\u attribute
和module\u name.dependency2
。因此,当运行module\u name.dependency2()
时,它将返回42
,而specific\u method()
将返回一个Mock
对象,该对象的属性值为“foo”
,方法返回“bar”
你可以用它来模拟函数、类甚至模块。我认为你的方法行不通。Django视图实际上是一个函数(不是实例),而as_view()
是CBV上返回视图函数的一个仅类的方法。我看不到立即的解决方案,因为pinject将依赖项注入到类实例中。您想用依赖项注入解决什么问题?这看起来像一个@Taek,我想让视图更容易测试。我是django的新手,但我很想实现类似Asp.Net的东西。重新表述这个问题:如何编写视图以便于模拟和测试?我对pinject一无所知,也不太了解依赖注入(这在Python中很少出现),但事实上Django的CBV实际上将从as_view
接收的所有参数传递到init方法中,它们存储为实例属性的位置。因此,您可以直接从url.py传递依赖项。如果没有更多的代码,我不确定,但这应该是您需要的:是的,在阅读@Taek的建议时,我得出了相同的结论