首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从类返回JsonResponse?

如何从类返回JsonResponse?
EN

Stack Overflow用户
提问于 2019-06-24 14:01:20
回答 1查看 104关注 0票数 0

我们用DRF做后端。我正在尝试创建一个类来处理整个系统中的非致命消息,返回为类似JsonResponse的APIException,但不引发异常。

我们的想法是能够做这样的事情:

代码语言:javascript
复制
    return APIMessage("This is my message.")

...with指定/覆盖message_type、message_code和status_code的可选args。

我遇到的第一个问题是__init__不能返回一个值。从this post,我找到了我应该做的方法,但我现在得到了这个错误.

代码语言:javascript
复制
__new__() takes 1 positional argument but 2 were given

这是我的课..。

代码语言:javascript
复制
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)

我意识到它需要一个显式的"self“arg,但是从上面链接的文章中的示例代码来看,__new__方法应该将"cls”作为它的第一个(只?)阿格。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-24 14:19:03

重写__new__肯定不是这样做的方法。如果有一个类在实例化时返回该类的实例以外的其他内容,这是没有意义的。

我想到了两种选择。一种是根本不使用类;因为您只想要将一些数据包装在响应中,所以应该编写一个函数来完成这个任务。

代码语言:javascript
复制
def api_message(message=None, message_code=None, message_type=None, status_code=None):
    ...
    return JsonResponse(result, status=status_code)

另一个是让您的类继承drf的响应类,并将数据传递到超类init。然后,当DRF接收到实例时,它将执行正确的操作。

代码语言:javascript
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56738253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档