【发布时间】:2020-04-06 18:44:42
【问题描述】:
我有一个父类 RestResponse 和子类 AccessDeniedResponse 的继承关系如下:
class RestResponse():
def __init__(self, data=None, content_type=None, message=None, count=None, data_status=True, **kwargs):
data_content = {
'status': data_status,
'message': message,
'data': data,
}
if count:
data_content.update({
'count': count
})
super(RestResponse, self).__init__(
data=data_content,
content_type=content_type,
**kwargs
)
class AccessDeniedResponse(RestResponse):
status_code = 401
当我调用 AccessDeniedResponse(errorMessage= '您无权下载。') 它会给出这个错误:
Traceback (most recent call last):
File "/home/ram/goenv/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/home/ram/goenv/lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/home/ram/goenv/lib/python3.7/site-packages/django/core/handlers/base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/ram/goenv/lib/python3.7/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "/home/ram/goenv/lib/python3.7/site-packages/django/views/generic/base.py", line 71, in view
return self.dispatch(request, *args, **kwargs)
File "/home/ram/goenv/lib/python3.7/site-packages/rest_framework/views.py", line 505, in dispatch
response = self.handle_exception(exc)
File "/home/ram/goenv/lib/python3.7/site-packages/rest_framework/views.py", line 462, in handle_exception
response = exception_handler(exc, context)
File "/home/ram/gomech/crapp/crapp/handlers/exception.py", line 10, in cr_exception_handler
raise exc
File "/home/ram/goenv/lib/python3.7/site-packages/rest_framework/views.py", line 502, in dispatch
response = handler(request, *args, **kwargs)
File "/home/ram/gomech/crapp/crapp/rest_api_views/orders.py", line 439, in get
return AccessDeniedResponse(errorMessage= 'You are not authorised to download.')
File "/home/ram/gomech/crapp/crapp/responses.py", line 20, in __init__
**kwargs
TypeError: __init__() got an unexpected keyword argument 'errorMessage'
【问题讨论】:
-
是的,
errorMessage没有在任何地方定义为有效参数,Response.__init__最终“拒绝”它。你的意思是message吗? -
@deceze 但是有 **kwargs 所以所有的 kwargs 都应该被接受。
-
但超类不接受它,请参阅here,我假设第 20 行是您对
super().__init__()的调用中的**kwargs -
即使您将
Response作为父类删除,问题仍然存在。现在您将errorMessage作为 kwarg 传递给object,它也不知道如何处理它。 -
不从
Response继承可能不是一个好主意。只需pop任何父类不期望的kwargs(并在调用super()后对它们进行处理)。
标签: django python-3.x django-rest-framework