Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django视图中的依赖项注入_Python_Django_Dependency Injection - Fatal编程技术网

Python 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

我想在django项目中使用依赖注入。为此,我正在试着包装。就像在ASP.NET中一样,所有依赖项都在构造函数中给出,这非常好,因为它很容易测试。我还想在django项目中归档类似的内容

我有一个简单的看法:

类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的建议时,我得出了相同的结论