我们在后端使用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。
我认为,如果我只创建一个实用程序函数,这会起作用,但是如果可能的话,我宁愿使用一个类。
答案 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)