如何从类中返回JsonResponse?

时间:2019-06-24 14:01:20

标签: django django-rest-framework

我们在后端使用DRF。我正在尝试创建一个类来处理整个系统中的非致命消息,以JsonResponse的形式返回-类似于APIException,但没有引发异常。

想法是能够执行以下操作:

    return APIMessage("This is my message.")

...带有可选的args,用于指定/覆盖message_type,message_code和status_code。

我遇到的第一个问题是__init__无法返回值。在this post中,我找到了应该做的方式,但是现在出现此错误...

__new__() takes 1 positional argument but 2 were given

这是我的课...

class APIMessage(object):
    default_message = None
    default_message_code = 'message'
    default_message_type = 'status'
    default_status_code = 200

    def __init__(self, message=None, message_code=None, message_type=None, status_code=None):
        if message is None:
            message = self.default_message
        if message is None:
            raise APIMessageRequired()

        if message_code is None:
            message_code = self.default_message_code

        if message_type is None:
            message_type = self.default_message_type

        self.status_code = status_code
        if status_code is None:
            self.status_code = self.default_status_code

        self.result = {
            'result': {
                'message':      message,
                'message_code': message_code,
                'message_type': message_type,
            }
        }

    def __new__(cls):
        return JsonResponse(cls.result, status=cls.status_code)

我意识到它想要一个显式的“自我” arg,但是从上面链接的示例代码中,__new__方法应将“ cls”作为其第一个(唯一?)arg。

我认为,如果我只创建一个实用程序函数,这会起作用,但是如果可能的话,我宁愿使用一个类。

1 个答案:

答案 0 :(得分:2)

最肯定的是,覆盖__new__不是的方法。没有一个类在实例化时返回除该类的实例之外的任何东西是没有意义的。

想到两个选择。一个是根本不使用任何类。由于您只想在响应中包装一些数据,因此您只需编写一个函数即可。

def api_message(message=None, message_code=None, message_type=None, status_code=None):
    ...
    return JsonResponse(result, status=status_code)

另一种方法是使您的类继承自drf的Response类,并将数据传递给超类init。 DRF收到实例后,便会做正确的事。

class APIMessage(Response):
    ...
    def __init__(self, message=None, message_code=None, message_type=None, status_code=None):
        ...
        super().__init__(self.result, status=self.status_code)