我试图实施 SOLID 原则。这次是Python中的依赖倒置 - Django

问题描述 投票:0回答:1

TypeError:SignInView.init() 缺少 1 个必需的位置参数:'api_response_factory'

我尝试使用抽象方法但失败了。我是 SOLID 实现的新手,也是 python 的新手,有人可以给我关于如何处理此类错误的建议或想法吗?

我必须补充一点,这是我第一次在 stackoverflow 上提问

from abc import ABC, abstractmethod
from rest_framework.views import APIView
from django.http import JsonResponse
from rest_framework import status

class ApiResponseFactoryAbstract(ABC):
    @abstractmethod
    def success(self) -> str:
        pass

class ApiResponseFactory(ApiResponseFactoryAbstract):
    def success(self) -> str:
        print("Testing")
        return "Testing"

class SignInView(APIView):
    def __init__(self, api_response_factory: ApiResponseFactoryAbstract):
        self.api_response_factory = api_response_factory

    def post(self, request):
        data = self.api_response_factory.success()
        return JsonResponse(data=data, status=status.HTTP_200_OK)

这是app/urls.py:

from django.urls import path
from . import views

router_auth = [
    path("sign-in/", views.SignInView.as_view(), name="sign-in"),
]

python django abstract-class solid-principles inversion
1个回答
0
投票

这是行不通的:

.as_view()
将为每个请求构造一个new
SignInView
对象来处理请求。但它因此不会传递对象。

幸运的是我们可以。事实上,我们可以在 initkwargs 中传递一个:

from django.urls import path

from . import views

router_auth = [
    path(
        'sign-in/',
        views.SignInView.as_view(api_response_factory=ApiResponseFactory()),
        name='sign-in',
    ),
]

话虽如此,我认为没有必要这样做。使用提供成功消息等实现的 mixin 可能更容易。它看起来有点像 over-engineering

© www.soinside.com 2019 - 2024. All rights reserved.