Я использую метод Flask-RESTful abort()
при построении ошибки ответ в REST. В приведенном примере есть именованный аргумент message
def abort_if_todo_doesnt_exist(todo_id):
if todo_id not in TODOS:
abort(404, message="Todo {} doesn't exist".format(todo_id))
Выход
{
"message": "Todo asd doesn't exist. You have requested this URI [/todos/asd] but did you mean /todos/<todo_id> or /todos ?"
}
В моем сценарии у меня уже есть собственный тип исключения
class InvalidParameter(Exception):
status_code = 400
def __init__(self, message, status_code=None, resource=None,
field=None, code=None, stack_trace=None):
Exception.__init__(self)
self.message = message
if status_code is not None:
self.status_code = status_code
self.resource = resource
self.field = field
self.code = code
self.stack_trace = stack_trace
def to_dict(self):
rv = {}
error = {}
rv['message'] = self.message
error['resource'] = self.resource
error['field'] = self.field
error['code'] = self.code
error['stack_trace'] = self.stack_trace
rv['error'] = error
return rv
и конкретная структура ответа JSON для ошибок:
{
"message": "Project name 'GGO' already exist.",
"error": {
"resource": "Project",
"field": "project_name",
"code": "already_exists",
"stack_trace": "(psycopg2.IntegrityError) duplicate key value violates unique ..."
}
}
Код проблемы
Я должен использовать два именованных аргумента
except InvalidParameter as err:
abort(err.status_code,
message=err.to_dict()['message'],
error=err.to_dict()['error'])
Когда я использую это, кроме InvalidParameter как err: abort(err.status_code, err.to_dict())
я получаю ошибку
TypeError: abort() takes 1 positional argument but 2 were given // Werkzeug Debugger
Как я могу передать весь err
dict в качестве параметра?
abort
занимает только 1 позиционный аргумент (http_status_code
) вместе с любым количествомkwargs
. Вот почему он ошибается сTypeError
, когда вы передаете 2 позиционных аргумента. Вы можете использовать распаковку dict**dict
, чтобы передать все ключевые аргументы из вашей переменнойerr
-abort(err.status_code, **err)
- person shad0w_wa1k3r   schedule 22.08.2017